c# - MVC 发布不向模型添加值

标签 c# .net asp.net-mvc razor asp.net-mvc-4

我有一个简单的用户模型编辑表单,但是当我回发时,没有任何隐藏的输入值被应用到模型,我不确定为什么会这样。

我的 Razor :

@model CMS.Core.Models.UserProfile

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset class="normalForm">
        <legend>User Profile</legend>

        @Html.HiddenFor(model => model.UserId)

        <div class="formRow">
            <div class="editor-label">
                @Html.LabelFor(model => model.EmailAddress)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.EmailAddress, new { @class = "textbox" })
                @Html.ValidationMessageFor(model => model.EmailAddress)
            </div>
        </div>

        <div class="formRow">
            <div class="editor-label">
                @Html.LabelFor(model => model.FirstName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.FirstName, new { @class = "textbox" })
                @Html.ValidationMessageFor(model => model.FirstName)
            </div>
        </div>

        <div class="buttonRow"><input type="submit" value="Save" class="button" /></div>
    </fieldset>
}

我的 Controller :

    [HttpPost]
    public ActionResult Edit(UserProfile user)
    {
        if (ModelState.IsValid)
        {
            user.Save();
            return RedirectToAction("Index");
        }
        return View(user);
    }

用户配置文件类:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; private set; }


    [Required(ErrorMessage = "Please enter an email address")]
    [StringLength(350)]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email Address")]
    public string EmailAddress { get; set; }


    [StringLength(100)]
    [DataType(DataType.Text)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
}

如果我尝试 user.UserId 它返回零(因为它是一个整数)但是如果我尝试 Request["UserId"] 它返回正确的值所以值被正确发布 - 只是没有添加到 UserProfile 模型中。有谁知道为什么会这样或者我能做些什么来解决它

谢谢

最佳答案

DefaultModelBinder 只能绑定(bind)公共(public)属性

将您的属性 setter 更改为公共(public),它应该可以正常工作:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }

如果您不能这样做,您将需要创建一个自定义模型绑定(bind)器来处理私有(private) setter 。

然而,作为一种更好的方法,而不是直接使用您的 UserProfile。创建一个 UserProfileViewModel,其中您的 UserId 是公开的,并在您的 View 和 Controller 操作中使用它。在这种情况下,您需要在 UserProfileUserProfileViewModel 之间进行映射,但是有一些很好的工具可以完成该任务,例如 AutoMapper .

关于c# - MVC 发布不向模型添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14459247/

相关文章:

javascript - 如何使用pace.js跟踪razor ajax表单

c# - vba/excel/c#将WorkSheet分割成多个文件的解决方法#

c# - 从数据表中提取两件事的总和

c# - 如何使用 C# Windows 应用程序将 byte[] 中的图像写入 MS WORD

.net - 从 .Net Framework v.4.0 到 4.5 还发生了哪些其他无声变化?

c# - 我如何检索上次发布 .NET MVC Web 应用程序的日期时间和用户?

asp.net-mvc - MVC - 更改下拉菜单中的默认文本

c# - AssemblyBuilder.SetCustomAttribute 中字节数组的用途是什么

c# - 用户控件中的 VisualStateManager

.net - 使用 Azure CLI 和 PublishSettings 将 Net Core 应用程序发布到 azurewebsites.net