【问题标题】:Dictionary<Enum, string>() won't bind to the Model in mvcDictionary<Enum, string>() 不会绑定到 mvc 中的模型
【发布时间】:2011-03-23 12:46:09
【问题描述】:

我正在尝试实现一些相当简单的事情,但模型绑定存在一些问题。

public enum ColumnType
        {
            Column1 = 1,
            Column2 = 2,
            Column3 = 3,
            Column4 = 4,
            Column5 = 5,
            Column6 = 6,
            Column7 = 7,
            Column8 = 8,
            Column9 = 9
        }

在我的 viewModel 中,我还有一个类型字典的属性,如下所示:

public class PageViewModel {
        public IDictionary<ColumnType, string> Columns { get; set; }
}

以下是我的视图:

    <tr>
    <%  foreach (var value in Enum.GetValues(typeof(ColumnType)))
        {
            %>
                <%: Html.TextBox(String.Format("Columns[ColumnType.{0}]", value.ToString()))%>
            <%
        }
    %>
    </tr>

我在上面发布到以下 POST 方法:

[POST]
public ActionResult Index(PageViewModel viewModel)
{
    var isNull = viewModel.Columns; //The model won't bind and 'isNull' is 'null' in here
    ...
    ...
}

如您所见,'viewModel.Columns' 属性在 POST 操作中为空。

我在这里错过了什么?

关于结果,应该如下所示:

// pseudocode
Columns[0] = Key=Column1, Value="text1Value";
Columns[1] = Key=Column2, Value="text2Value";
...

我知道视图中一定有类似Columns[0].Key = Column1; Column[0].Value = "text1Value" 的东西,但我不确定。

非常感谢你们!

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    试试这样:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new PageViewModel
            {
                Columns = Enum.GetValues(typeof(ColumnType)).Cast<ColumnType>().ToDictionary(x => x, x => x.ToString())
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(PageViewModel model)
        {
            return View();
        }
    }
    

    在视图中:

    <% using (Html.BeginForm()) { %>
        <% for (var i = 0; i < Model.Columns.Count; i++) { %>
            <%= Html.Hidden("Columns[" + i + "].Key", Model.Columns.ElementAt(i).Key) %>
            <%= Html.TextBox("Columns[" + i + "].Value", Model.Columns.ElementAt(i).Value) %>
        <% } %>
        <input type="submit" value="OK" />
    <% } %>
    

    【讨论】:

      【解决方案2】:

      当然是null,因为你没有初始化它。

      您可以为PageViewModel 编写一个构造函数,该构造函数实例化(通过new 关键字)并用相应的值填充列。

      PageViewModel model = new PageViewModel();
      

      尽管如此,我认为您没有充分解释您的问题,因为您要输出的格式与您在问题末尾所描述的不符。

      【讨论】:

      • 感谢您的回复!但我已经在 GET 方法中进行了“初始化”部分。据了解,我在这里避免提及这一点。关于输出,这只是伪代码。请尝试再联系一次。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多