2017-07-23 39 views
0

我有这样的视图模型:如何使用标准HTML从视图发送值控制器

public class MemberRegisterVM 
{ 
    public Users User { get; set; } 
    public Location Location { get; set; } 
} 

UserLocation模型

用户组成:

public partial class Users : Persons 
{ 
    public Guid? UserRoleId { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public DateTime? RegisterDate { get; set; } 
    public DateTime ExpireDate { get; set; } 
    public bool IsLock { get; set; } 
    public string DigitalSignture { get; set; } 
    public Guid? BranchID { get; set; } 
    public int PersonType { get; set; } 
    public Guid Token { get; set; } 
} 

public partial class Users 
{ 
    public string NewPassword { get; set; } 
    public string ConfirmPassword { get; set; } 
    public string ConfirmDigitalSignture { get; set; } 

} 

位置:

public class Location 
    { 
     public int ID { get; set; } 
     public int ParentId { get; set; } 
     public int TypeId { get; set; } 
     public int Code { get; set; } 
     public string Name { get; set; } 
    } 

对于单一型号,[for example: User Model]我知道,如果我用一个标准的HTML输入下面一样,它会送我的数据基础上,以控制器为参考模型及Name attribute

查看:

@model User 

<input name="UserName" Id="UserName" type="text" /> 

控制器:

public ActionResult Submit(User user) 
{ 
     //user.UserName is filled here 
} 

现在我的问题是如何命名我的标准HTML元素将数据发送到控制器作为我的视图模型(它由几个模型组成)?使用html.helper我会参考它如下例如:

@Html.TextBoxFor(x => x.User.UserName) 

它会像下面?

<input type="Text" name="User.UserName" id="User.UserName"> 

还是别的什么?因为我已经在上面尝试过了,但它仍然在表单提交时将值作为null发送。

更新:

我已经排除在表单上其他的领域,它们是基于HTML。佣工和传递值正确,但有2场未工作的权利之一将是Gender和第二会BirthDate,因为用户模型,从模型的人继承我会在这里一样好:

角色模型:

public class Persons 
{ 
    public bool Gender { get; set; } 
    public Datetime BirthDate { get; set; } 
} 

这是我的看法

@model Models.MemberRegisterVM 

@{ 
    Layout = "~/Views/Shared/_SiteLayout.cshtml"; 
} 
@using Entities.Texts; 
@using (@Html.BeginForm("Register", "MembershipAuth", FormMethod.Post)) 
{ 
    <div class="form-horizontal"> 
     <div class="col-sm-6"> 
       <div class="col-sm-12"> 
        <div class="control-label col-sm-2"> 
         @Labels.Gender 
        </div> 
        <div class="col-sm-5"> 
         <input name="User.Gender" type="radio" id="men_gender" value="0" /> 
         <label for="men_gender">@Labels.Male</label> 
        </div> 
        <div class="col-sm-5"> 
         <input name="User.Gender" type="radio" id="female_gender" value="1" /> 
         <label for="female_gender">@Labels.Female</label> 
        </div> 
       </div> 
      </div> 
      <div class="form-group"> 
       <div class="col-sm-12"> 
        <div class="control-label col-sm-2"> 
         @Labels.BirthDay 
        </div> 
        <div class="col-sm-10"> 
         <input type="text" name="User.BirthDate" id="User_BirthDate" /> 
        </div> 
       </div> 
      </div> 
      <div class="form-group"> 
       <div class="col-sm-12"> 
        <div class="g-recaptcha" data-sitekey="6LfLWCkUAAAAAPSp-Fr8bp5egiX8Pw7oKxzZbkmk" style="text-align: center"></div> 
       </div> 
      </div> 
      <div class="form-group"> 
       <input type="submit" class="btn btn-primary" value="Sign Up" /> 
      </div> 
     </div> 
    </div> 

} 

,这是我ActionResult在控制器:

[HttpPost] 
[AllowAnonymous] 
public ActionResult Register(Models.MemberRegisterVM vm, FormCollection form) 

{ 
    //vm.User.Gender is not filled here as well as vm.User.BirthDate 
} 
+2

是的,它会产生'name'属性(但是'id'属性将会是'id =“User_UserName”'' - 你检查了你生成的html)吗? –

+0

如果你的代码不工作,然后显示它:) –

+0

@StephenMuecke是的,我做过,我假设mvc通过名称属性了解数据,但是当我不想使用HTML.Helpers并使用标准HTML,就像什么HTML.Helpers创建它不会将值发送给控制器,并且我将该值作为空值。 – Valkyrie

回答

1

name属性是正确的,但是你Gender属性不会正确绑定(该值将始终是false),因为用的01值的生成单选按钮。为了结合到bool,它们需要TrueFalse的值,例如,

<input name="User.Gender" type="radio" id="men_gender" value="True" /> 

虽然你的属性名称/类型并没有真正意义Gender(无论是制作型的enum与“男”和“女”,或更改名称bool IsMale会更合适)

您还没有给出有关BirthDate属性发布的值的足够详细信息,但是如果它没有绑定,那么这很可能是由于日期的格式与服务器的区域性不匹配(例如,如果7/24/2017已发布,但服务器的文化接受日期格式为dd/MM/yyyy)。

它不清楚为什么你想手动生成HTML。您丢失的双向模型绑定(例如,如果您编辑现有数据或需要返回视图,因为ModelState无效,控件将不会显示正确的值),并且您没有获得任何客户端验证。至少应该检查POST方法中的ModelState的值,以查看添加了哪些验证错误。

作为一个附注,没有理由在您的方法中包含FormCollection form参数,因为您绑定了模型。

0

看的所有第一,我建议你: -

  • 使用@Html助手尽可能这样

    @Html.TextBoxFor(x => x.User.UserName) 
    
  • 视图模型应该是简单的或复杂对象,但不能从任何类派生,因为它只是一个数据传输对象,这将帮助您从MVC默认模型联编程序和模型状态提供程序中获得最大收益,使代码更加清晰nd通过避免编写表单集合或Request.Form来帮助您编写较少代码Here

  • 对于日期时间,您可以使用字符串模型属性并手动转换或覆盖全局中的默认模型活页夹行为。 ASAX例如

    ModelBinders.Binders[typeof(DateTime)] = 
        new DateAndTimeModelBinder() { CustomFormat = "yyyy-mm-dd" }; 
    

或根据JavaScript的选择器

的任何格式,这些点后,我们可以说: - 在MVC

@Html.TextBoxFor(x => x.User.UserName) 

等于

<input type="Text" name="User.UserName" id="User_UserName"> 

<input type="Text" name="User.UserName" id="User.UserName"> 

的ID不要紧名字的事情,这里要说的是,该模型粘结剂将默认只有当它绑定此属性是简单或复杂的VM对象属性之一,不是派生的属性

我希望这有任何帮助。

+0

建议为'DateTime'使用'string'是可怕的建议。 ''id确实有一个'.'(点)意味着任何jquery或css选择器都将它解释为类选择器的开始。 –

+0

如果所需的日期时间格式与要使用的服务器文化不兼容,该怎么办? 我的意思是名称的问题和id从默认的模型绑定器的角度来看并不重要。因此,如果您希望模型联编程序收集表单值并绑定它,只需使用与模型属性匹配的表单名称。 –

+0

通常,您将创建一个自定义的“ModelBinder”来处理服务器上的不同区域性(或者以ISO格式发布值 - 'yyyy-MM-dd' - 将永远绑定) –

相关问题