【问题标题】:postback viewModel is null [duplicate]回发 viewModel 为空 [重复]
【发布时间】:2014-12-29 12:49:37
【问题描述】:

我尝试搜索这个问题,但找不到解决方案,请帮助我

我的视图模型:

namespace webShop.ViewModels.Home
{
    public class RegisterUserViewModel
    {
        public User User { get; set; }

        public UsersDetaile UsersDetaile { get; set; }

        public IEnumerable<state> state { get; set; }
    }
}

我的模特:

public partial class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Roles { get; set; }
    public byte Status { get; set; }

    public virtual UsersDetaile UsersDetaile { get; set; }
}

public partial class UsersDetaile
{
    public int userID { get; set; }
    public Nullable<System.DateTime> BirthDate { get; set; }
    public string Mobile { get; set; }
    public string Tell { get; set; }
    public bool Gender { get; set; }
    public byte city { get; set; }
    public byte state { get; set; }
    public string postCode { get; set; }
    public string address { get; set; }

    public virtual City City1 { get; set; }
    public virtual State State{ get; set; }
    public virtual User User { get; set; }
}

和我的控制器:

[HttpGet]
public ActionResult Register()
{ 
    OstanRepository stateRep = new OstanRepository();
    var model = new RegisterUserViewModel();
    model.state = stateRep.Select().ToList();
    return View(model);
}

[HttpPost]
public ActionResult Register(RegisterUserViewModel user)
{
   //My Code
}

和我的注册视图

@model webShop.ViewModels.Home.RegisterUserViewModel

@using (Ajax.BeginForm("Register", "Home", new AjaxOptions { HttpMethod = "Post", Url = "/Home/Register" }))
{

  @Html.AntiForgeryToken()
  @Html.ValidationSummary(true)
  <h1 class="block-header">Register</h1>
      <div class="group">
          <label class="label">Name <span class="required">*</span></label>
          <div class="controls">
              @Html.TextBoxFor(p => p.User.Name, new { @class = "text" })
              @Html.ValidationMessageFor(p => p.User.Name)
          </div>
      </div>

    //....

  <div class="group">
        <label class="label">Address </label>
        <div class="controls">
            @Html.TextBoxFor(p => p.UsersDetaile.address, new { @class = "text" })
            @Html.ValidationMessageFor(p => p.UsersDetaile.address)
        </div>
  </div>

  <div class="form">
    <div class="group">
        <div class="controls">
             <button class="button">Submit</button>
        </div>
    </div>
  </div>
}

按提交后userusersDetailenull,我该怎么办?


当然,如果我使用这个动作,它的工作原理!!!

public ActionResult Register(User user)
{
    //...
}

我找不到解决方案,请帮助我

【问题讨论】:

  • 你的视图模型是什么?
  • 我认为这是一个绑定问题。默认的 ModelBinder 无法理解带有 Property 的类型 UsersDetaile。将 View Model 属性名称 UsersDetaile 更改为其他名称,然后重试。
  • 您能否提供有关所需行为的更多详细信息?

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

我看到的你做错了,你必须将 ViewModel 传递给你 View,目前你只是将 ViewModel 的 User 属性传递给你的视图,这意味着你的 View 被强类型为 User 类型而不是 @987654323 @,这就是您将操作参数更改为User 的原因:

[HttpGet]
public ActionResult Register()
{ 
    OstanRepository stateRep = new OstanRepository();
    var model = new RegisterUserViewModel();
    model.state = stateRep.Select().ToList();
    return View(model); // pass ViewModel to view not only User Model
}

你的观点应该是强类型RegisterUserViewModel:

视图集模型为RegisterUserViewModel

@model webShop.ViewModels.Home.RegisterUserViewModel

【讨论】:

    【解决方案2】:

    绑定失败,因为您的 POST 方法参数名为 user,并且您的模型 (RegisterUserViewModel) 包含同名的属性 (public User User { get; set; })

    将您的方法签名更改为

    [HttpPost]
    public ActionResult Register(RegisterUserViewModel model)
    

    并且属性将被正确绑定。或者,您可以更改属性名称,但这意味着更新您的视图代码

    `public User Person { get; set; }`
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 2016-02-13
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多