为什么列表<selectlistitem>在帖子上变为空?</selectlistitem>

时间:2011-09-08 06:20:08

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

我试图在Asp.Net MVC 3.0中显示一个RadioButtonList。这是我的扩展方法:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Linq.Expressions;
using System.Text;

public static class HtmlExtensions
{
    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
    {
        StringBuilder stringBuilder = new StringBuilder();
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        if (selectList != null)
        {
            foreach (var item in selectList)
            {
                var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);
                var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
                var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id });

                stringBuilder.AppendFormat("<div class=\"RadioButton\">{0}{1}</div>",radio.ToHtmlString(),label.ToHtmlString());
            }
        }
        return new MvcHtmlString(stringBuilder.ToString());
    }
}

这些是我的HomeController动作方法:

public ActionResult Index()
{
    return View(GetIndexViewModel());
}

private IndexViewModel GetIndexViewModel()
{
    List<SelectListItem> list = new List<SelectListItem> 
    {
        new SelectListItem{ Selected = true, Value = "1", Text = "Sunday" },
        new SelectListItem{ Selected = false, Value = "2", Text = "Monday" },
        new SelectListItem{ Selected = false, Value = "3", Text = "Tuesday" },
        new SelectListItem{ Selected = false, Value = "4", Text = "Wednesday" },
        new SelectListItem{ Selected = false, Value = "5", Text = "Thursday" },
        new SelectListItem{ Selected = false, Value = "6", Text = "Friday" },
        new SelectListItem{ Selected = false, Value = "7", Text = "Saturday" },
    };
    return new IndexViewModel { SelectLists = list, SelectedItem = list[0] };
}

[HttpPost]
public ActionResult Index(IndexViewModel indexViewModel)
{
    return View(GetIndexViewModel()); //this works

    return View(indexViewModel); //why this doesn't work??
}

这是我的index.cshtml:

@model IndexViewModel    

@using (Html.BeginForm())
{
    <h2>Select any one item</h2>

    @Html.RadioButtonForSelectList(model => model.SelectedItem.Value, Model.SelectLists)

    <br />

    <input type="submit" value="Submit" />
}

我已评论哪一个有效,哪一个无效。基本上我的列表变为空。我究竟做错了什么?如果我每次都必须这样做,那么最好使用webforms,因为webforms可以保留回发中的数据。使用MVC基本上意味着我必须在每次发布值时进行数据库调用。我是否正确或我的代码中有错误?

1 个答案:

答案 0 :(得分:7)

因为绑定 GET操作中的某些内容并不意味着它将绑定回到POST操作中的同一属性。默认模型绑定器仅绑定它在请求中看到的内容。因此,如果在发布时未将此信息发送到服务器,则该信息将丢失。

您的自定义助手会生成一堆单选按钮和标签,但我无法在任何地方看到您为文本属性生成输入字段。结果他们将会迷失。

这就是说你的帮助程序看起来是正确的,在你的POST操作中,如果你想重新显示同一个视图,你应该简单地从你最初支持它的数据存储区中重新获取这些信息。因此,正确的方法如下:

[HttpPost]
public ActionResult Index(IndexViewModel IndexViewModel)
{
    return View(GetIndexViewModel());
}