我想使用模型绑定来保持我的控制器看起来更干净,你可以看到使用模型绑定有多好:
public ActionResult Create(Person personToCreate)
{
//Create person here
}
Run Code Online (Sandbox Code Playgroud)
VS
public ActionResult Create(string firstName, string lastName, string address, string phoneNum, string email, string postalCode, string city, string province, string country)
{
//Create person here
}
Run Code Online (Sandbox Code Playgroud)
在进行模型绑定时,我们可以使用具有正确名称的表单 Html.TextBox("")
怎么样jquery?我怎样才能确保当我执行$.post(url, data, callback, dataType)或$.ajax(options)调用Create(Person personToCreate)Person对象被正确填充时?
使用以下代码时,字段的id和标签的for属性中的id不相同.
<%: Html.LabelFor(x => x.Localizations["en"]) %> => Localizations[en]
<%: Html.TextBoxFor(x=> x.Localizations["en"]) %> => Localizations_en_
<%: Html.LabelFor(x => x.Localizations["en"].Property) %>
=> Localizations[en]_Property
<%: Html.TextBoxFor(x=> x.Localizations["en"].Property) %>
=> Localizations_en__Property
Run Code Online (Sandbox Code Playgroud)
我在反射器中跟踪代码,发现生成值的方式不同.不使用相同的帮助方法.
LabelFor用途HtmlHelper.GenerateIdFromName和TextBoxFor用途TagBuilder#GenerateId.
有没有人知道这个的原因,或解决方法(除了编写你自己的整套输入/ textarea /选择助手)?或者这是一个错误?
更新:
因为我总是使用标签文本的第二个参数为标签使用html帮助器,我修改它以使用与表单字段助手相同的id生成代码.
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string labelText)
{
// The main part of this code is taken from the internal code for Html.LabelFor<TModel, TValue>(...).
var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var fieldName = ExpressionHelper.GetExpressionText(expression);
TagBuilder builder = new …Run Code Online (Sandbox Code Playgroud) 在我的MVC 3 Razor应用程序中,我有一个带有枚举的模型..
模型示例:
public class EmployeeModel
{
public enum Title
{
Accountant = 111,
Sales = 222,
Production = 333
}
[Required]
public string Name {get; set;}
[Required]
public Title JobTitle {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
在我的视图中,我想使用Html助手来构建一个Html表单...
查看示例:
@model ..Models.EmployeeModel
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
<br>
@Html.LabelFor(m => m.JobTitle)
@Html.DropDownListFor(m => m.JobTitle, ??How do I get Title enum values??)
<br>
<input type="submit />
}
Run Code Online (Sandbox Code Playgroud)
我试图实现的DropDownListFor的输出如下所示: 注意选项值与枚举的初始化值匹配
<select name="JobTitle">
<option value="-1">Choose a Job Title</option>
<option value="111">Accountant</option>
<option value="222">Sales</option> …Run Code Online (Sandbox Code Playgroud) asp.net-mvc html-helper html.dropdownlistfor razor asp.net-mvc-3
我注意到ASP.NET MVC的TextAreaFor HTML帮助程序中最烦人(可能)的错误.出于某种原因,HTML帮助程序会在textarea中的任何内容之前添加NewLine.显然,这是为了解决个人内容的可能问题,从有意的新线开始,浏览器按照规范忽略它.
然而,通过添加它,我得到了更多烦人的错误,现在我的所有textareas在表单加载任何内容之前自动有一个额外的行(即在我的字段中的任何内容之前显示:).在吐出之前,似乎某些东西正在编码"换行符".
任何人有一个解决方法吗?我希望打算输出它的预期行为
<textarea>
Stuff</textarea>
Run Code Online (Sandbox Code Playgroud)
不是
<textarea> Stuff</textarea>
Run Code Online (Sandbox Code Playgroud)
我越来越...
编辑 进一步检查,这似乎是由于我使用AntiXssLibrary进行编码而不是默认的HtmlEncoder.我使用的是4.0版,我的编码器类方法如下所示:
protected override void HtmlEncode(string value, TextWriter output)
{
output.Write(Microsoft.Security.Application.Encoder.HtmlEncode(value));
}
Run Code Online (Sandbox Code Playgroud)
所以我的想法是,因为从TextAreaHelper调用的TagBuilder类,HTML编码标签的内容,它是默认HTML编码器的行为,但AntiXssLibrary更彻底,因此你看到这种行为?
我有一个HTML帮助器:
@Html.EditorFor(model => model.Description)
Run Code Online (Sandbox Code Playgroud)
但它对于我的模型的属性中的数据来说太小了.Descriptino是一个1000个字符的字符串.我需要用户能够输入几行文本并将其包装在HTML对象中.我该怎么做呢?
当它回发时,我收到以下错误:
具有键'ClosingDateDay'的ViewData项的类型为'System.Int32',但必须是'IEnumerable'类型.有任何想法吗?
这是我的控制器:
CompetitionEditViewModel viewModel = new CompetitionEditViewModel
{
ClosingDate = competition.CloseDate,
Description = competition.Description,
DescriptionHeading = competition.DescriptionHeading,
ImageAssetId = competition.ImageAssetId,
IsActive = competition.IsActive,
MainHeading = competition.MainHeading,
TermsAndConditions = competition.TermsAndConditions,
UrlSlug = competition.UrlSlug
};
viewModel.ClosingDateMonthOptions = new List<SelectListItem>();
for (int i = 1; i <= 12; i++)
{
string monthName = new DateTime(2000, i, 1).ToString("MMMM");
((List<SelectListItem>)viewModel.ClosingDateMonthOptions).Add(new SelectListItem { Text = monthName, Value = i.ToString() });
}
viewModel.ClosingDateDayOptions = new List<SelectListItem>();
for (int i = 1; i <= 31; i++)
{ …Run Code Online (Sandbox Code Playgroud) 这是我的观点.如何使用CheckboxFor():
@using eMCViewModels;
@model eMCViewModels.RolesViewModel
@{
ViewBag.Title = "CreateNew";
}
<h2>
CreateNew<
/h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>RolesViewModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div>
@foreach (RoleAccessViewModel mnu in Model.RoleAccess)
{
// How to use checkboxfor here?
}
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)
Model.RoleAccess是一个List<RoleAccessViewModel>,我想创建复选框使用@Html.CheckBoxFor().
这是我的 RoleAccessViewModel
public class RoleAccessViewModel
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用表达式构建一个自定义HTML帮助器来绘制标签云,其中进入标签云的数据来自表达式.我会让代码在这里谈谈:
查看模型
public class ViewModel
{
public IList<MyType> MyTypes { get; set; }
public IList<MyOtherType> MyOtherTypes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
视图
<div>
@Html.TagCloudFor(m => m.MyTypes)
</div>
<div>
@Html.TagCloudFor(m => m.MyOtherTypes)
</div>
Run Code Online (Sandbox Code Playgroud)
帮手
public static MvcHtmlString TagCloudFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TProperty : IList<MyType> where TProperty : IList<MyOtherType>
{
// So my actual question here is: how do I get my IList<TProperty> collection
// so I can iterate through and build my HTML control
}
Run Code Online (Sandbox Code Playgroud)
我已经快速浏览过并完成了常规的Google搜索,但我似乎无法找到具体的答案.我认为它在某个地区,expression.Compile().Invoke() …
我们正在尝试将布局的部分设置为“必需”,但可根据各个页面进行配置。目前,我们使用Section进行此操作。
@section FloatingNav {
<h1>@Model.Name <span class="release-year">@Model.AverageRating</span></h1>
<ul class="sub-nav">
<li class="active"><a href="#episodes">Episodes</a></li>
<li><a href="#episodes">Cast</a></li>
<li>Reviews</li>
<li>Related</li>
</ul>
}
Run Code Online (Sandbox Code Playgroud)
这要求您在每个新页面中都设置此块,但我想通过一些默认值和使用部分视图进行配置的选项来使此过程更容易。我希望设置像这样的Razor助手。
@using System.Web.Mvc.Html
@helper FloatingNav(string name, int rating) {
@section FloatingNav {
<h1>
name <span class="release-year">rating</span></h1>
<ul class="sub-nav">
<li class="active"><a href="#episodes">Episodes</a></li>
<li><a href="#episodes">Cast</a></li>
<li>Reviews</li>
<li>Related</li>
</ul>
}
}
@helper FloatingNav(System.Web.Mvc.HtmlHelper html, string viewName) {
@section FloatingNav {
@html.Partial(viewName)
}
}
@helper FloatingNav(System.Web.Mvc.HtmlHelper html, string viewName, object model) {
@section FloatingNav {
@html.Partial(viewName, model)
}
}
Run Code Online (Sandbox Code Playgroud)
因此要实现的语法类似于
@Layout.FloatingNav(@Model.Name, @Model.AverageRating)
Run Code Online (Sandbox Code Playgroud)
要么
@Layout.FloatingNav("_SimpleNav", @Model)
Run Code Online (Sandbox Code Playgroud)
但是,问题在于,剃刀助手似乎不了解该节的语法。有没有办法在Razor …
我正在编写一个自定义的HTML帮助器来显示一个Grid,我正专注于Telerik和其他各方,我想使用的语法.
我有一个具有3个属性(Name,DateUpdated和DateCreted)的模型,并将一个IEnumerable传递给我的视图:
@model IEnumerable<GridPageFolderViewModel>
Run Code Online (Sandbox Code Playgroud)
然后我有我的静态HtmlHelperExtensions类:
public static class HtmlHelperExtensions
{
#region Grid
public static GridBuilder<TModelEntry> GridFor<TModel, TModelEntry>(this HtmlHelper<TModel> htmlHelper, TModelEntry model)
{
return new GridBuilder<TModelEntry>();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
这个类确实返回一个GridBuilder,如下所示:
public class GridBuilder<TModel> : IGridBuilder
{
#region Properties
private string name { get; set; }
#endregion
#region Methods
public GridBuilder<TModel> WithColumns(Action<ColumnBuilder<TModel>> function)
{
return this;
}
internal MvcHtmlString Render()
{
return new MvcHtmlString("This is a value.");
}
#endregion
#region IGridBuilder Members
public GridBuilder<TModel> Name(string name)
{
this.name = name;
return this; …Run Code Online (Sandbox Code Playgroud)