gpt4 book ai didi

c# - 您如何从同一 View 中分别正确地发布到 2 个相似的表单?

转载 作者:行者123 更新时间:2023-11-30 12:15:08 25 4
gpt4 key购买 nike

这似乎是我在 stackoverflow 上看到的一个相当常见的问题,但似乎没有人知道我正在寻找的答案。我有 2 种形式(标准用户登录和注册表),我想在同一个 View 中使用。如果一切顺利,它会正常工作,但如果他们的失败并且表格重新发布,则会发生 2 件不希望发生的事情:

  1. 虽然只填写了一个,但两种形式都尝试验证。
  2. “用户名”输入的 ID 在两个表单中相同,因此在一个表单中输入的数据会在两个表单中填充。

我不确定我需要了解什么有关验证才能使其正常工作,我们将不胜感激任何帮助。

代码如下:

@{
ViewBag.Title = "Log On";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@{Html.RenderPartial("LogIn", (FortyEightHourPrint.Models.LogOnModel)ViewBag.LogInModel);}
@{Html.RenderPartial("Register", (FortyEightHourPrint.Models.RegisterModel)ViewBag.RegisterModel);}

和注册部分 View

@using (Html.BeginForm("Register","Account")) {
@Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.")
<div>
<fieldset>
<legend>Account Information</legend>

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

<div class="editor-label">
@Html.LabelFor(m => m.Email)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</div>

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

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

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

和登录

    @using (Html.BeginForm("LogIn","Account"))
{
<div>
<fieldset>
<legend>Account Information</legend>

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

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

<div class="editor-label">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>

<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>
}

当然还有 Controller 正在做的事情

   public ActionResult LogOn()
{
if ((bool)(ViewBag.OkToRedirect ?? false))
return Redirect(getReturnUrl(ViewBag.ReturnUrl));
return View();
}
public PartialViewResult LogIn()
{
return PartialView();
}
//
// POST: /Account/LogIn

[HttpPost]
public ViewResult LogIn(LogOnModel model, string returnUrl)
{
ViewBag.OkToRedirect = false;
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
ViewBag.OkToRedirect = true;
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
ViewBag.LogInModel = model;
ViewBag.ReturnUrl = returnUrl;
return View("LogOn");
}


public PartialViewResult Register()
{
return PartialView();
}

//
// POST: /Account/Register

[HttpPost]
public ViewResult Register(RegisterModel model, string returnUrl)
{
ViewBag.OkToRedirect = false;
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
ViewBag.OkToRedirect = true;
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}

ViewBag.RegisterModel = model;
ViewBag.ReturnUrl = returnUrl;
return View("LogOn");
}

此外,我是 mvc 的新手,所以如果有人能提出更好的方法,我会洗耳恭听。

最佳答案

  1. 将这些扩展方法添加到某个类中:

    public static IDisposable BeginFieldPrefix<TModel>(this HtmlHelper<TModel> html,
    Expression<Func<TModel, object>> expression)
    {
    return BeginFieldPrefix(html, (LambdaExpression) expression);
    }

    internal static IDisposable BeginFieldPrefix(this HtmlHelper html, LambdaExpression expression)
    {
    return BeginFieldPrefix(html, html.GetName(ExpressionHelper.GetExpressionText(expression)));
    }

    public static IDisposable BeginFieldPrefix(this HtmlHelper html, string fieldPrefix)
    {
    var templateInfo = html.ViewData.TemplateInfo;
    string oldFieldPrefix = templateInfo.HtmlFieldPrefix;
    templateInfo.HtmlFieldPrefix = fieldPrefix;
    return Disposable.Create(() => templateInfo.HtmlFieldPrefix = oldFieldPrefix);
    }

    public static string GetName<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
    return html.GetName(ExpressionHelper.GetExpressionText(expression));
    }

    public static string GetName(this HtmlHelper html, string expression)
    {
    return html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
    }

Disposable 类位于 Rx Framework 中:http://msdn.microsoft.com/en-us/library/system.reactive.disposables.disposable(v=vs.103).aspx

  1. 在您的 BeginForm block 中使用以下代码为所有字段添加前缀:

    @using(Html.BeginFieldPrefix("LoginForm")) { ...

    @using(Html.BeginFieldPrefix("RegisterForm")) { ...

  2. 使用 UpdateModelTryUpdateModel 重载允许指定字段前缀而不是隐式模型更新(参见 http://msdn.microsoft.com/en-us/library/dd493137.aspx )。

关于c# - 您如何从同一 View 中分别正确地发布到 2 个相似的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com