Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC RC验证:这是正确的吗?_C#_Asp.net Mvc_Validation_Binding_Html Helper - Fatal编程技术网

C# MVC RC验证:这是正确的吗?

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"]); 为什么我必须重新绑定该值我只需要在添加错误

我只是想在MVC RC中做一些简单的验证,但得到了一个错误。就这个问题而言,我没有使用UpdateModel

以下是表格中的代码:

<%= 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);
    }

}