2012-06-10 75 views
1

使用JQuery可排序,並嘗試將新訂單發回給我的控制器,但沒有很多運氣。我的看法是:發送新訂單回MVC控制器

using (Ajax.BeginForm("EditTickerOrder", new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", })) 
{ 
    <div id="editableticker"> 
     @Html.HiddenFor(m => m.ProjectGUID) 
     <ul id="sortablediv"> 
      @foreach (DGI.CoBRA.Tools.BussinessObjects.CollabLibrary.TickerObjects.Ticker t in Model) 
      { 
       <li class="ui-state-default" id="@t.pKeyGuid.ToString()"> 
        <p>@Html.CheckBox(t.pKeyGuid.ToString(), t.Display, new { @class = "activechk" }) 
         <span style="font-weight: bold"> 
          @t.Text 
         </span> 
        </p> 
       </li> 
      } 
     </ul> 
    <input type="submit" value="Save New Ticker Order" /> 
} 

和我的控制器:

[HttpPost] 
public ActionResult EditTickerOrder(Guid ProjectGUID, List<string> items) 
{ 
    TickerCollectionModel TickerData = new TickerCollectionModel(); 
    TickerData.ProjectGUID = ProjectGUID; 
    TickerData.ListAllBySession(ProjectGUID); 
    return PartialView("TickerList", TickerData); 
} 

list<string> items總是null。有任何想法嗎?

回答

2

您正在編寫foreach循環,肯定會違反您的表單輸入字段的naming conventions,默認模型聯編程序期望它使用集合。如果您不尊重已建立的連線格式,則不能指望默認的模型綁定器能夠在POST操作中重新使用模型。

事實上,您爲什麼不使用視圖模型和編輯器模板?他們使ASP.NET MVC中的一切變得微不足道。

因此,讓我們來定義,這將反映您的視圖要求視圖模型(或至少是你提問中所示的=>你當然可以用,你要處理其他屬性豐富它):

public class TickerViewModel 
{ 
    public Guid Id { get; set; } 
    public bool IsDisplay { get; set; } 
    public string Text { get; set; } 
} 

public class ProjectViewModel 
{ 
    public Guid ProjectGUID { get; set; } 
    public IEnumerable<TickerViewModel> Tickers { get; set; } 
} 

然後是負責查詢DAL層的控制器,檢索域模型,將域模型映射到我們爲此視圖定義的視圖模型,並將視圖模型傳遞給視圖。相反地​​,POST操作接收視圖模型從視圖,視圖模型映射回一些域模型,通過域模型到您的DAL層用於處理並呈現一些視圖或重定向到一個成功的操作:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // TODO: those values come from a data layer of course 
     var model = new ProjectViewModel 
     { 
      ProjectGUID = Guid.NewGuid(), 
      Tickers = new[] 
      { 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 1" }, 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 2" }, 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 3" }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ProjectViewModel model) 
    { 
     // Everything will be correctly bound here => map the view model 
     // back into your domain model and pass the domain model to 
     // your DAL layer for processing ... 

     return Content("Thanks for submitting"); 
    } 
} 

的圖(值得注意的是,在這個例子中我已經使用了一個標準的形式,而不是AJAX但它是微不足道將其轉換成一個AJAX形式):

@model ProjectViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.ProjectGUID) 
    <div id="editableticker"> 
     <ul id="sortablediv"> 
      @Html.EditorFor(x => x.Tickers) 
     </ul> 
    </div> 
    <button type="submit">OK</button> 
} 

,最後相應編輯器模板自動地將針對Tickers系列的每個元素進行渲染(~/Views/Home/EditorTemplates/TickerViewModel.cshtml):

@model TickerViewModel 

<li class="ui-state-default"> 
    <p> 
     @Html.CheckBoxFor(x => x.IsDisplay, new { @class = "activechk" }) 
     @Html.LabelFor(x => x.IsDisplay, Model.Text) 
     @Html.HiddenFor(x => x.Text) 
     @Html.HiddenFor(x => x.Id) 
    </p> 
</li> 
+0

好的,是的。就是這樣! – Phil

+0

你是否因好奇而測試過這個?出於某種原因,雖然我確實在控制器中獲得了正確的項目,但他們以原始順序返回,不記得我的新「重新排序」。這對你有用嗎? – Phil

+0

你在說什麼*訂單? –