Asp.net mvc 4 将模型tproperty表达式传递给部分
我在这样的表单上有很多“是/否”单选按钮:Asp.net mvc 4 将模型tproperty表达式传递给部分,asp.net-mvc-4,razor,partial-views,Asp.net Mvc 4,Razor,Partial Views,我在这样的表单上有很多“是/否”单选按钮: <div class="form-row"> @Html.DisplayNameFor(m => m.OptIn48Hours)<br /> <label>@Html.RadioButtonFor(m => m.OptIn48Hours, "true") Yes</label> <label&
<div class="form-row">
@Html.DisplayNameFor(m => m.OptIn48Hours)<br />
<label>@Html.RadioButtonFor(m => m.OptIn48Hours, "true") Yes</label>
<label>@Html.RadioButtonFor(m => m.OptIn48Hours, "false") No</label>
@Html.ValidationMessageFor(m => m.OptIn48Hours)
</div>
但这只是将值传递给分部,而不是传递给
m.OptIn48Hours
是什么。如何传入m.optin48小时
我建议使用html助手扩展方法来生成控件
public static MvcHtmlString YesNoButtonsFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
{
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string name = ExpressionHelper.GetExpressionText(expression);
// ensure we use unique `id` attributes if being used in a collection
string id = HtmlHelper.GenerateIdFromName(name) ?? metaData.PropertyName;
StringBuilder html = new StringBuilder();
TagBuilder label = new TagBuilder("div");
label.InnerHtml = helper.DisplayNameFor(expression).ToString();
html.Append(label);
string yesId = string.Format("{0}_Yes", id);
html.Append(helper.RadioButtonFor(expression, true, new { id = yesId }));
html.Append(helper.Label(yesId, "Yes"));
string noId = string.Format("{0}_No", metaData.PropertyName);
html.Append(helper.RadioButtonFor(expression, false, new { id = noId }));
html.Append(helper.Label(noId, "No"));
html.Append(helper.ValidationMessageFor(expression));
TagBuilder div = new TagBuilder("div");
div.AddCssClass("form-row");
div.InnerHtml = html.ToString();
return new MvcHtmlString(div.ToString());
}
您最好为此创建一个自定义html帮助程序-比如说
@html.YesNoButtonsFor(m=>m.yourProperty)
好主意,我会考虑一下,谢谢,这是一种享受-我的助手将简单得多,但我喜欢所有额外的功能,这是一个增强,允许在集合中使用
@Html.Partial("_RadioYesNo", Model.OptIn48Hours)
public static MvcHtmlString YesNoButtonsFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> expression)
{
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string name = ExpressionHelper.GetExpressionText(expression);
// ensure we use unique `id` attributes if being used in a collection
string id = HtmlHelper.GenerateIdFromName(name) ?? metaData.PropertyName;
StringBuilder html = new StringBuilder();
TagBuilder label = new TagBuilder("div");
label.InnerHtml = helper.DisplayNameFor(expression).ToString();
html.Append(label);
string yesId = string.Format("{0}_Yes", id);
html.Append(helper.RadioButtonFor(expression, true, new { id = yesId }));
html.Append(helper.Label(yesId, "Yes"));
string noId = string.Format("{0}_No", metaData.PropertyName);
html.Append(helper.RadioButtonFor(expression, false, new { id = noId }));
html.Append(helper.Label(noId, "No"));
html.Append(helper.ValidationMessageFor(expression));
TagBuilder div = new TagBuilder("div");
div.AddCssClass("form-row");
div.InnerHtml = html.ToString();
return new MvcHtmlString(div.ToString());
}
@Html.YesNoButtonsFor(m => m.yourBooleanProperty)