asp.net MVC 4多个帖子通过不同的形式

Dav*_*d15 25 c# forms asp.net-mvc http-post

现在我明白了

if (IsPost){   //do stuff }
Run Code Online (Sandbox Code Playgroud)

检查该页面上的所有发布方法.但是,我有两种不同的形式发布2个不同的信息.这些是登录表单和注册表单.

有没有办法可以根据哪种形式检查IsPost?例如,

if(Login.IsPost){ //do stuff }
Run Code Online (Sandbox Code Playgroud)

但是我如何定义Login变量?我的表格如下:

<form id="Login" method = "POST">
Run Code Online (Sandbox Code Playgroud)

我试过了:

var Login = Form.["Login"]
Run Code Online (Sandbox Code Playgroud)

那没起效.

我将不胜感激任何帮助.

谢谢.

jps*_*ook 32

在MVC视图中,您可以根据需要使用尽可能多的字段.为了简单起见,请使用单个视图模型,其中包含页面上每个表单所需的所有属性.请注意,您只能访问您提交的表单中的表单字段数据.因此,如果您在同一页面上有登录表单和注册表单,您可以这样做:

LoginRegisterViewModel.cs

public class LoginRegisterViewModel {
    public string LoginUsername { get; set; }
    public string LoginPassword { get; set; }

    public string RegisterUsername { get; set; }
    public string RegisterPassword { get; set; }
    public string RegisterFirstName { get; set; }
    public string RegisterLastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

YourViewName.cshtml

@model LoginRegisterViewModel

@using (Html.BeginForm("Login", "Member", FormMethod.Post, new {})) {

    @Html.LabelFor(m => m.LoginUsername)
    @Html.TextBoxFor(m => m.LoginUsername)

    @Html.LabelFor(m => m.LoginPassword)
    @Html.TextBoxFor(m => m.LoginPassword)

    <input type='Submit' value='Login' />

}

@using (Html.BeginForm("Register", "Member", FormMethod.Post, new {})) {

    @Html.LabelFor(m => m.RegisterFirstName)
    @Html.TextBoxFor(m => m.RegisterFirstName)

    @Html.LabelFor(m => m.RegisterLastName)
    @Html.TextBoxFor(m => m.RegisterLastName)

    @Html.LabelFor(m => m.RegisterUsername)
    @Html.TextBoxFor(m => m.RegisterUsername)

    @Html.LabelFor(m => m.RegisterPassword)
    @Html.TextBoxFor(m => m.RegisterPassword)

    <input type='Submit' value='Register' />
Run Code Online (Sandbox Code Playgroud)

}

MemberController.cs

[HttpGet]
public ActionResult LoginRegister() {
     LoginRegisterViewModel model = new LoginRegisterViewModel();
     return view("LoginRegister", model);
}

[HttpPost]
public ActionResult Login(LoginRegisterViewModel model) {
 //do your login code here
}

[HttpPost]
public ActionResult Register(LoginRegisterViewModel model) {
 //do your registration code here
}
Run Code Online (Sandbox Code Playgroud)

不要忘记,在调用BeginForm时,您传递的控制器名称没有附加"Controller":

@using (Html.BeginForm("Login", "Member", FormMethod.Post, new {}))
Run Code Online (Sandbox Code Playgroud)

代替:

@using (Html.BeginForm("Login", "MemberController", FormMethod.Post, new {}))
Run Code Online (Sandbox Code Playgroud)

  • 那你怎么做验证呢?假设你有使用必需属性修饰的模型并添加2个验证摘要,但是你如何确定,只有登录字段包含在第一个摘要中,只有寄存器字段是第二个?而且,通过按Login,您将只验证登录字段? (31认同)
  • 这不是一个好方法.每个表单需要1个模型绑定,所有表单都在同一个视图模型上,并在控制器前面加上每个模型的属性名称 (5认同)
  • 这是正确的一半,错误的一半.您如何验证您的模型?这怎么可能是一个公认的答案?难以置信的. (3认同)

edt*_*ant 27

我只是为每个需要的表单加载一个局部视图(包含一个表单),给每个部分一个不同的viewmodel:

  • 多页面形式要求:满意.
  • 每个表单上的Javascript不显眼的验证:已完成.

  • 对于那些遇到此解决方案问题的人,请确保在部分视图中使用自动生成的`@using(Html.BeginForm())`表单提交不起作用,您需要使用更明确的`@使用(Html.BeginForm("Login","Member",FormMethod.Post,new {}))`.谢谢+1 (2认同)