在布局页面上提交表单

Submit form on layout page

我是 mvc 新手。我喜欢从布局页面提交带有按钮的表单。还需要以某种方式将模型传递给视图的控制器。有什么提示或想法吗?

@if (!WebSecurity.IsAuthenticated) {
<form class="navbar-form navbar-right">
    <div class="form-group">
        <input type="text" class="form-control" placeholder="Benutzername">
    </div>
    <div class="form-group">
        <input type="text" class="form-control" placeholder="Passwort">
    </div>
    <input type="submit" class="btn btn-success" value="Login"/>
    <input type="submit" class="btn btn-danger" value="Registrieren" />
</form>
}
else {
    <form class="navbar-form navbar-right">
        <input type="submit" class="btn btn-danger" value="Logout">
    </form>
}

public class LoginModel
{
    [Required]
    [Display(Name = "Benutzername")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Kennwort")]
    public string Password { get; set; }

    [Display(Name = "Speichern?")]
    public bool RememberMe { get; set; }
}

public class RegisterModel
{
    [Required]
    [Display(Name = "Benutzername")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "&quote{0}&quote muss mindestens {2} Zeichen lang sein.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Kennwort")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Kennwort bestätigen")]
    [Compare("Password", ErrorMessage = "Das Kennwort entspricht nicht dem Bestätigungskennwort.")]
    public string ConfirmPassword { get; set; }
}

每个 input 标记的属性 name 绑定到您的 Model class 的属性中,因此,只需将 name 属性添加到属性 您要绑定的名称,例如:

<form class="navbar-form navbar-right">
    <div class="form-group">
        <input type="text" class="form-control" name="UserName" placeholder="Benutzername">
    </div>
    <div class="form-group">
        <input type="text" class="form-control" name="Password" placeholder="Passwort">
    </div>
    <input type="submit" class="btn btn-success" value="Login"/>
    <input type="submit" class="btn btn-danger" value="Registrieren" />
</form>

提示

我建议您将此代码更改为 PartialView 而不是保留在 Layout 页面上。它很有用,因为您可以在模型中键入 PartialView,并使用 Html 帮助程序(例如 Html.TextBoxFor(model => model.UserName, ...))生成输入标签作为示例。有很多 Html Helpers can help you like Html.BeginForm() method 我在这里都说了,这是一个很好的实践,但是你的代码会 运行 很好,因为这些很好的实践生成了像你这样的代码。

布局模型必须与页面模型相同。因此,这不是特别实用,除非您想对所有事情都使用基本模型,这不是好的做法。

更好的方法是使用 Html.Action() 并为您的登录表单使用单独的控制器操作,然后它可以拥有自己的模型和执行上下文。

几个 PartialView 怎么样?这是一个 rough/general 示例:

public class Login {
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class Register : Login {
    public string ConfirmPassword { get; set; }
}

部分登录:

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

    <fieldset>
        <legend>Login</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>

        <p>
            <input type="submit" value="Login" />
        </p>
    </fieldset>
}

注册部分:

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

    <fieldset>
        <legend>Register</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.ConfirmPassword)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ConfirmPassword)
            @Html.ValidationMessageFor(model => model.ConfirmPassword)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>

        <p>
            <input type="submit" value="Register" />
        </p>
    </fieldset>
}

在您的布局(或任何其他视图)中引用部分内容:

@Html.Partial("LoginPartial")
@Html.Partial("RegisterPartial")