我正在使用ASP.NET MVC2 RC,无法弄清楚如何获取HTML帮助程序,TextBoxfor使用ViewModel模式.在编辑页面上使用时,在控制器中调用UpdateModel()时,不会保存数据.我从NerdDinner应用程序中获取了以下代码示例.
Edit.aspx
<%@ Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NerdDinner.Models.DinnerFormViewModel>" %>
...
<p>
// This works when saving in controller (MVC 1)
<label for="Title">Dinner Title:</label>
<%= Html.TextBox("Title", Model.Dinner.Title) %>
<%= Html.ValidationMessage("Title", "*") %>
</p>
<p>
// This does not work when saving in the controller (MVC 2)
<label for="Title">Dinner Title:</label>
<%= Html.TextBoxFor(model => model.Dinner.Title) %>
<%= Html.ValidationMessageFor(model=> model.Dinner.Title) %>
</p>
Run Code Online (Sandbox Code Playgroud)
DinnerController
// POST: /Dinners/Edit/5
[HttpPost, Authorize]
public ActionResult Edit(int id, FormCollection collection) {
Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name)) …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写自己的小HTML帮助程序,它的行为非常类似DropDownListFor但不会遇到我之前遇到过的相同问题.我们不讨论是否DropDownListFor有缺陷 - 这不是这个问题的意义所在.
无论如何,MVC人员ToMvcHtmlString内部而非公开的原因是什么?
升级到MVC 3 RTM后,我得到了一个以前工作的例外.
这是场景.我有几个使用相同底层接口IActivity和IOwned的对象.
IActivity implements IOwned (another interface)
public interface IActivity:IOwned {...}
public interface IOwned
{
int? AuthorId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个局部视图,它使用IActivity从其他具体的部分重用.
以下是Activity Partial的定义.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IActivity>" %>
<%: Html.HiddenFor(item => item.AuthorId) %>
Run Code Online (Sandbox Code Playgroud)
但是,它会引发异常.它在ModelMetadata中找不到AuthorId.
我猜测在之前的版本中它查看了IActivity实现的接口.
任何想法,建议,到处都没有重复类似的接口?
复制下面的堆栈跟踪.
[ArgumentException: The property IActivity.AuthorId could not be found.]
System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor, Type containerType, String propertyName) +498313
System.Web.Mvc.ModelMetadata.GetMetadataFromProvider(Func`1 modelAccessor, Type modelType, String propertyName, Type containerType) +101
System.Web.Mvc.ModelMetadata.FromLambdaExpression(Expression`1 expression, ViewDataDictionary`1 viewData) +393
System.Web.Mvc.Html.InputExtensions.HiddenFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IDictionary`2 htmlAttributes) +57
System.Web.Mvc.Html.InputExtensions.HiddenFor(HtmlHelper`1 htmlHelper, Expression`1 expression) +51
ASP.views_shared_activity_ascx.__Render__control1(HtmlTextWriter …Run Code Online (Sandbox Code Playgroud) namespace System.Web.Mvc.Html
{
// Summary:
// Represents support for HTML in an application.
public static class FormExtensions
{
public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName);
...
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到,BeginForm方法中第一个参数前面的'this'对象似乎不被接受为参数.看起来在真正的BeginForm方法中的功能如下:
BeginForm(string actionName, string controllerName);
Run Code Online (Sandbox Code Playgroud)
省略第一个参数.但它实际上以隐藏的方式以某种方式接收第一个参数.能告诉我这个结构是如何工作的吗?我实际上正在探索MVC 4互联网示例.谢谢.
刚刚开始玩ASP.NET MVC并且偶然发现了以下情况.感觉很像一个bug,但如果不是,一个解释将不胜感激:)
视图包含非常基本的东西
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>
Run Code Online (Sandbox Code Playgroud)
不使用模型时,值和所选项目按预期设置:
//works fine
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'
return View();
}
Run Code Online (Sandbox Code Playgroud)
但是当尝试通过模型加载时,文本框的值设置为预期,但下拉列表不会获得选定的项目集.
//doesnt work
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
var model = new {
MyList = "XXX", //set …Run Code Online (Sandbox Code Playgroud) 在MVC的世界里,我有这个视图模型......
public class MyViewModel{
[Required]
public string FirstName{ get; set; } }
Run Code Online (Sandbox Code Playgroud)
......在我看来......这种事情......
<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>
Run Code Online (Sandbox Code Playgroud)
我的问题:如果我提交此表单而不提供名称,我会收到以下消息"FirstName字段是必需的"
好.所以,我去改变我的财产......
[DisplayName("First Name")]
[Required]
public string FirstName{ get; set; }
Run Code Online (Sandbox Code Playgroud)
..现在得到"名字字段是必需的"
到目前为止都很好.
所以现在我想要错误信息显示"名字Blah Blah".如何覆盖默认消息以显示DisplayName +"Blah Blah",而不是用类似的东西注释所有属性
[Required(ErrorMessage = "First Name Blah Blah")]
Run Code Online (Sandbox Code Playgroud)
干杯,
ETFairfax
我试图使用强类型视图的值格式化ASP.Net MVC的TextBoxFor呈现的日期.日期可以为空,所以如果它为null我想看到一个空白值,否则我希望以MM/dd/yyyy格式看到它.
<%= Html.TextBoxFor(model => model.BirthDate, new { style = "width: 75px;" })%>
Run Code Online (Sandbox Code Playgroud)
谢谢,
Paul Speranza
我目前正在使用Html.EditorFor <>方法生成编辑器字段,但我想使用类似的东西以只读格式显示字段信息,例如详细信息页面,即带有字段名称后跟一个标签的标签带有字段值的标签.
目前在MVC中是否有任何等效的产生?或者我将不得不创建一个自定义助手?
提前致谢.
编辑:我知道DisplayFor和LabelFor,它只是手动必须组合这些?
我试图ProductCatalog在ASP.NET MVC中呈现复合视图.这要求我Product每页渲染多个视图.每个产品视图都是一个单独的表单.我需要表单字段具有基于id的前缀,以便我在呈现的文档中没有重复的ID.有没有办法定义要应用于Html扩展生成的所有表单字段的前缀,还是需要手动构建它?
我正在开发一个asp.net mvc-5 Web应用程序.我有以下模特课: -
public class Details4
{
[HiddenInput(DisplayValue=false)]
public string RESOURCENAME { set; get; }
[Display (Name="Account Name")]
[Required]
public string ACCOUNTNAME { set; get; }
[Display(Name = "Resource type")]
[Required]
public string RESOURCETYPE { set; get; }
[DataType(DataType.Password)]
[Required]
public string PASSWORD { set; get; }
[Display(Name = "Description")]
[DataType(DataType.MultilineText)]
public string Description { set; get; }
[Display(Name= "URL")]
[Url]
public string RESOURCEURL { set; get; }
[Display(Name="Owner Name")]
[Required]
public string OWNERNAME { set; get; }
[Display(Name …Run Code Online (Sandbox Code Playgroud)