【问题标题】:MVC 3 - Model is Always Null in AJAX ControllerMVC 3 - AJAX 控制器中的模型始终为空
【发布时间】:2013-12-18 17:39:35
【问题描述】:

全部,

当通过 AJAX 将表单值发布到我的控制器 (/Contact/Process) 时,模型始终为 null 并且 ModelState.IsValid 始终为 false。不知道为什么模型会为空。 AJAX 帖子正在运行,并且有水合参数。

谢谢

萤火虫
参数
联系方式.Email xxx@example.com
Contact.FirstName John
Contact.LastName Doe
Contact.Message 您好
X-Requested-With XMLHttpRequest
联系提交

视图模型

namespace GuitarCollector.Models.ViewModels
{
    public class ContactViewModel
    {
        public Contact Contact { get; set; }
    }
}

模型

namespace GuitarCollector.Models
{
    public class Contact
    {
        //Primary Key
        public int Id { get; set; }

        [Display(Name = "First name")]
        [Required(ErrorMessage = "Please enter your first name")]
        public string FirstName { get; set; }

        [Display(Name = "Last name")]
        [Required(ErrorMessage = "Please enter your last name")]
        public string LastName { get; set; }



        [Display(Name = "Email address")]
        [Required(ErrorMessage = "Please enter your email address")]
        public string Email { get; set; }

        [Display(Name = "Message")]
        [Required(ErrorMessage = "Please enter your message")]
        public string Message { get; set; }

        public DateTime DateCreated { get; set; }
    }
}

表格

<div id="content">
    <div id="Status"></div>
    @using (Ajax.BeginForm("Process","Contact", new AjaxOptions{ HttpMethod = "POST", UpdateTargetId = "Status"}))
    {
         @Html.ValidationSummary(true)

         <p><span class="required">&#42; All fields are required.</span></p>

        <!-- First Name -->
        <div>
            @Html.LabelFor(model => model.Contact.FirstName) <span class="required">&#42;</span>
        </div>
        @Html.EditorFor(model => model.Contact.FirstName)
        @Html.ValidationMessageFor(model =>model.Contact.FirstName)

        <!-- Last Name -->
         <div>
            @Html.LabelFor(model => model.Contact.LastName) <span class="required">&#42;</span>
        </div>
        @Html.EditorFor(model => model.Contact.LastName)
        @Html.ValidationMessageFor(model =>model.Contact.LastName)

        <!-- Email -->
         <div>
            @Html.LabelFor(model => model.Contact.Email) <span class="required">&#42;</span>
        </div>
        @Html.EditorFor(model => model.Contact.Email)
        @Html.ValidationMessageFor(model =>model.Contact.Email)

        <!-- Message -->
         <div>
            @Html.LabelFor(model => model.Contact.Message) <span class="required">&#42;</span>
        </div>
        @Html.TextAreaFor(model => model.Contact.Message)
        @Html.ValidationMessageFor(model =>model.Contact.Message)

        <div>
            <input type="submit" name="contact" id="contact" value="Submit" class="btn"/> 
       </div>

    }

</div>

控制者

[HttpPost]
public ActionResult Process(ContactViewModel model)
{
    if (ModelState.IsValid)
    {
        model.Contact.DateCreated = DateTime.Now;
        db.Contacts.Add(model.Contact);
        db.SaveChanges();

        return Content("Success!");

    }

    return Content("Failure");

}

【问题讨论】:

  • 是日期时间
  • 尝试将&lt;input type="submit" name="contact" /&gt; name 属性更改为其他内容。
  • 谢谢。这是解决方案的一部分。我将提交按钮名称和 id 属性重命名为“contactForm”,并且还必须删除隐藏字段:Contact.Id 和 Contact.DateCreated。请发布您的答案并附上解释

标签: ajax asp.net-mvc asp.net-mvc-3


【解决方案1】:

您必须为 submit 输入指定其他名称,而不是您的 ViewModel 的属性名称,或者完全删除它。我认为你实际上并不需要它。在这种情况下,它不会被序列化并传递给控制器​​。

模型以 null 的形式出现,因为模型绑定器无法将值“提交”绑定到 Contact 属性。

【讨论】:

    【解决方案2】:

    你忘了:

     @Html.HiddenFor(model => model.Contact.Id )
     @Html.HiddenFor(model => model.Contact.DateCreated)
    

    和asp.net mvc不能做绑定

    【讨论】:

    • 谢谢,很好,但模型仍然是空的
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2013-01-18
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多