2012-06-10 52 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

你在说什么*订单? –