C# MVC RC验证:这是正确的吗?
我只是想在MVC RC中做一些简单的验证,但得到了一个错误。就这个问题而言,我没有使用UpdateModel 以下是表格中的代码:C# MVC RC验证:这是正确的吗?,c#,asp.net-mvc,validation,binding,html-helper,C#,Asp.net Mvc,Validation,Binding,Html Helper,我只是想在MVC RC中做一些简单的验证,但得到了一个错误。就这个问题而言,我没有使用UpdateModel 以下是表格中的代码: <%= Html.TextBox("UserId")%> <%= Html.ValidationMessage("UserId") %> 为了解决这个问题,我还添加了以下行: ModelState.SetModelValue("UserId", ValueProvider["UserId"]); 为什么我必须重新绑定该值我只需要在添加错误
<%= Html.TextBox("UserId")%>
<%= Html.ValidationMessage("UserId") %>
为了解决这个问题,我还添加了以下行:
ModelState.SetModelValue("UserId", ValueProvider["UserId"]);
为什么我必须重新绑定该值我只需要在添加错误时执行此操作,但似乎我不应该执行此操作。我觉得我做错了什么,或者只是对装订不够熟悉
看来我不是唯一一个看到这一切的人。根据请求,以下是控制器代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
AppUser newUser = new AppUser();
try
{
newUser.UserId = collection["UserId"];
AppUserDAL.AddUser(newUser);
return RedirectToAction("Index");
}
catch (Exception ex)
{
ViewData["ReturnMessage"] = ex.Message;
ModelState.AddModelError("UserId", "*");
ModelState.SetModelValue("UserId", ValueProvider["UserId"]);
return View(newUser);
}
您肯定不需要调用SetModelValue 也许您只需要视图就可以从传入的模型中提取文本框
<%= Html.TextBox("UserId", Model.UserId)%>
我就是这样做的。调用此扩展方法:
public static void AddModelError (this ModelStateDictionary modelState, string key, string errorMessage, string attemptedValue) {
modelState.AddModelError (key, errorMessage);
modelState.SetModelValue (key, new ValueProviderResult (attemptedValue, attemptedValue, null));
}
From:您可以尝试此扩展来使用lambda表达式设置模型值:
/// <summary>
/// Sets model value.
/// </summary>
/// <typeparam name="TViewModel">The type of the view model.</typeparam>
/// <typeparam name="TProperty">The type of the property</typeparam>
/// <param name="me">Me.</param>
/// <param name="lambdaExpression">The lambda expression.</param>
///<param name="value">New Value</param>
public static void SetModelValue<TViewModel, TProperty>(
this ModelStateDictionary me,
Expression<Func<TViewModel, TProperty>> lambdaExpression,
object value)
{
string key = WebControlsExtensions.GetIdFor<TViewModel, TProperty>(lambdaExpression, ".");
if (!string.IsNullOrWhiteSpace(key))
{
me.SetModelValue(key, new ValueProviderResult(value, String.Empty, System.Globalization.CultureInfo.InvariantCulture));
}
}
//
///设置模型值。
///
///视图模型的类型。
///属性的类型
///我。
///lambda表达式。
///新价值
公共静态void SetModelValue(
这本字典是我的,
表达式lambdaExpression,
对象值)
{
string key=WebControlsExtensions.GetIdFor(lambdaExpression,“.”);
如果(!string.IsNullOrWhiteSpace(键))
{
SetModelValue(key,new-ValueProviderResult(value,String.Empty,System.Globalization.CultureInfo.InvariantCulture));
}
}
要获取id,请执行以下操作:
public static class WebControlsExtensions
{
/// <summary>
/// Devuelve el Id correspondiente a la expresión lambda pasada por parámetro reemplazando los caracteres inválidos por la cadena pasada por parámetro
/// </summary>
/// <typeparam name="TViewModel">El tipo del modelo</typeparam>
/// <typeparam name="TProperty">El tipo de la propiedad</typeparam>
/// <param name="expression">Expresión lambda</param>
/// <param name="invalidCharReplacement">Cadena de texto que reemplaza a los carácteres inválido</param>
/// <remarks>
/// Valid characters consist of letters, numbers, and the hyphen ("-"), underscore ("_"), and colon (":") characters.
/// All other characters are considered invalid. Each invalid character in originalId is replaced with the character specified in the HtmlHelper.IdAttributeDotReplacement property.
/// </remarks>
/// <returns> Devuelve el Id correspondiente a la expresión lambda</returns>
public static string GetIdFor<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression, string invalidCharReplacement)
{
return TagBuilder.CreateSanitizedId(ExpressionHelper.GetExpressionText(expression), invalidCharReplacement);
}
}
公共静态类网络控件
{
///
与之对应的是:
///
///埃尔蒂波德莫代洛酒店
///艾尔提波德拉皮耶达德酒店
///兰博达酒店
///卡德娜·德·德克斯特德·卡德娜·德·德克斯特德·卡德娜·德克斯特德·卡德娜·德克斯特德·卡德娜·德克斯特德·卡德娜·德克斯特德·卡德娜·德克斯特德·卡德娜·德克斯特德·卡德娜·卡德娜
///
///有效字符由字母、数字、连字符(“-”)、下划线(“389;”)和冒号(:”)组成。
///所有其他字符都被视为无效。originalId中的每个无效字符都将替换为HtmlHelper.IDAttributedToReplace属性中指定的字符。
///
///这是一个相对应的解释
公共静态字符串GetIdFor(表达式表达式,字符串invalidCharReplacement)
{
返回TagBuilder.CreateSanitizedId(ExpressionHelper.GetExpressionText(表达式),invalidCharReplacement);
}
}
我也注意到了这一点,我只是把它当作我做错了的事情写了下来,然后继续做其他的工作。你能添加一个完整的页面代码和控制器的方法吗?我试过了,它似乎也不起作用。奇怪的是,当我将鼠标移到视图中中断的代码行上时,模型对象不是空的,我可以看到所有的值。这将起作用,尽管它似乎有点笨手笨脚。感谢您的回复。我们将查看1.0版本中是否修复了此问题
public static class WebControlsExtensions
{
/// <summary>
/// Devuelve el Id correspondiente a la expresión lambda pasada por parámetro reemplazando los caracteres inválidos por la cadena pasada por parámetro
/// </summary>
/// <typeparam name="TViewModel">El tipo del modelo</typeparam>
/// <typeparam name="TProperty">El tipo de la propiedad</typeparam>
/// <param name="expression">Expresión lambda</param>
/// <param name="invalidCharReplacement">Cadena de texto que reemplaza a los carácteres inválido</param>
/// <remarks>
/// Valid characters consist of letters, numbers, and the hyphen ("-"), underscore ("_"), and colon (":") characters.
/// All other characters are considered invalid. Each invalid character in originalId is replaced with the character specified in the HtmlHelper.IdAttributeDotReplacement property.
/// </remarks>
/// <returns> Devuelve el Id correspondiente a la expresión lambda</returns>
public static string GetIdFor<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression, string invalidCharReplacement)
{
return TagBuilder.CreateSanitizedId(ExpressionHelper.GetExpressionText(expression), invalidCharReplacement);
}
}