我想在Asp.Net MVC 3.0中显示一个RadioButtonList。这是我的扩展方法:为什么列表<SelectListItem>在发布后变为空?
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 action方法:
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基本上意味着每次发布值时都必须进行数据库调用。我是正确的还是在我的代码中有一些错误?
是否很难将参数编写为camelCase? – Phill
@菲尔:对不起,我没有明白你的意思;) – Jaggu