【问题标题】:How to fill ViewModel which has List<T> property after clicking submit button mvc 3?单击提交按钮 mvc 3 后如何填充具有 List<T> 属性的 ViewModel?
【发布时间】:2012-07-06 10:52:11
【问题描述】:

我想使用 viewModel 制作一周中的某一天复选框。视图上一切正常,但是,如果我单击提交以保存更改,我的 httppost 方法中的weeklySchedule 为空。

为什么weeklySchedule 为空?如何将选定的复选框值发送到我的 HttPost 操作?任何建议都会有所帮助。

型号:

public class Settings
{
    public class WeeklySetting
    {
        public string DisplayName { get; set; }
        public string Value { get; set; }
        public bool IsChecked { get; set; }
    }
}

查看模型:

public class ViewModels
{
    public class Weekly
    {
        public List&#60;Settings.WeeklySetting&#62; Settings { get; set; }
    }
}


public ActionResult CreateWeekly()
   {
       var model = new ViewModels.Weekly
       {
             Settings = new[] 
             {
             new Settings.WeeklySetting{ DisplayName="Monday", Value="MON", IsChecked=false},
             new Settings.WeeklySetting{ DisplayName="Tuesday", Value="TUE", IsChecked=false},
             new Settings.WeeklySetting{ DisplayName="Wednesday", Value="WED", IsChecked=false},
             new Settings.WeeklySetting{ DisplayName="Thursday", Value="THU", IsChecked=false},
             new Settings.WeeklySetting{ DisplayName="Friday", Value="FRI", IsChecked=false},
             new Settings.WeeklySetting{ DisplayName="Saturday", Value="SAT", IsChecked=false},
              new Settings.WeeklySetting{ DisplayName="Sunday", Value="SUN", IsChecked=false},
            }.ToList()
       };
           return View(model);

   }
   [HttpPost]
   public ActionResult CreateWeekly(string submitButton, ViewModels.Weekly weeklySchedule)
   {

    //Do something
       return View("CreateWeekly", weeklySchedule);
   } 

查看:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.Controllers.ViewModels.Weekly>" %>

创造周刊 内容>

  &#60;div&#62;
  &#60;%foreach (var item in Model.Settings)
    {%&#62;

        &#60;%:Html.CheckBoxFor(q=&#62;item.IsChecked) %&#62;
        &#60;%:Html.LabelFor(q=&#62;item.IsChecked,item.DisplayName) %&#62;
        &#60;%:Html.HiddenFor(q=&#62;item.Value) %&#62;
   &#60;% } %&#62;

  &#60;/div&#62;
&#60;br /&#62;
   &#60;input value="GenerateForWeekly" name="submitButton" type="submit" /&#62;
      &#60;%} %&#62;

内容>

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    当您开始在视图中使用 foreach() { } 循环时,模型绑定不能很好地工作。如果您将 EditorTemplate 用于 WeeklySetting,您会发现它会更好地为您整理所有索引。

    例如(这是 MVC3 Razor 视图语法)

    (1) 为 WeeklySetting 创建一个编辑器模板:

    @model Settings.WeeklySetting
    @Html.CheckBoxFor(m => m.IsChecked)
    @Html.LabelFor(m => m.IsChecked,Model.DisplayName)
    @Html.HiddenFor(m => m.DisplayName)
    @Html.HiddenFor(m => m.Value)
    

    (2) 使用 EditorFor 在您的视图中渲染(无 foreach):

    @using (Html.BeginForm())
    {
        <div>
            @Html.EditorFor(m => m.Settings)
        </div>
        <br />
        <input value="GenerateForWeekly" name="submitButton" type="submit" />
    }
    

    【讨论】:

    • 但我必须使用 asp.net mvc 3 :(
    • @programmerist 我的代码适用于 asp.net mvc3,唯一的区别是您使用的是 ASPX 视图引擎而不是 Razor 视图引擎。原理是一样的。
    • 抱歉,如何设计编辑器模板
    • 我写的代码和你的链接一样:coding-in.net/asp-net-mvc-3-how-to-use-editortemplates。我看不出有什么不同。
    【解决方案2】:

    如果您使用for 循环而不是foreach,它应该可以工作。 如此处所示: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多