Asp.net mvc ASP.NET MVC中的多种表单

Asp.net mvc ASP.NET MVC中的多种表单,asp.net-mvc,forms,post,Asp.net Mvc,Forms,Post,上下文 假设我有: 在布局站点中。主: <div class="leftColumn"> <asp:ContentPlaceHolder ID="MainContent" runat="server" /> </div> <div class="rightColumn"> <% Html.RenderPartial("_Login"); %> <asp:ContentPlaceHolder ID="Side

上下文
假设我有:
在布局站点中。主:

<div class="leftColumn">
    <asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
<div class="rightColumn">
    <% Html.RenderPartial("_Login"); %>
    <asp:ContentPlaceHolder ID="SideContent" runat="server" />
</div>

登录partialView看起来像:

<form action="/myApp/Account/Login" method="post">
    <input name="name" />Name<br />
    <input name="password" type="password" />Password<br />
    <button>Login</button>
</form>

名称
密码
登录
是否可以只更新登录小部件表单,而不更新整个内容页

if(pass != true) 
{ 
 ViewData["Message'] = "Hey your login failed!"; Return View("Login") 
}
在查看页面上

<form action="/tralala/Account/Login" method="post"> 
  <input name="name" />Name<br /> 
  <input name="password" type="password" />Password<br /> 

  <button>Login</button> 
 <div style="color: red"><%=ViewData["Message"] %><div> 
</form>

名称
密码
登录
你的问题不是很清楚


但据我所知,答案很可能是肯定的。您可以根据用户输入更新任何内容。

如果您引用的是http post,则只有通过表单中的提交按钮启动的post(也可以通过javascript启动)才会发布到服务器

如果表单是嵌套的,那么这将不起作用。外部表单将始终发布到服务器

在下面的示例HTML中,单击第一个表单上的submit按钮不会将第二个表单中的值发送到服务器。同样,单击第二个submit按钮不会发布第一个表单中的值

<html>
...
  <body> 
    <div>

      <form action="/Login/Login" method="post">
        <input type="text" name="username" value="" />
        <input type="text" name="passowrd" value="" />
        <input type="submit" name="login" value="Login" />
      </form>


      <form action="/Login/AdminLogin" method="post">
        <input type="text" name="username" value="" />
        <input type="text" name="passowrd" value="" />
        <input type="submit" name="login" value="Login Admin" />
      </form>
    </div>
</body>
</html>

...

如果您只想更新/更改其中一个表单部分,那么不使用javascript并执行javascript post(aka)就无法完成此操作。

如果您构建了一个接受FormCollection的控制器方法,并且您的视图定义了两个表单,返回的formcollection将使用表单A或表单B中的值填充。您可以检查formcollection并根据其中的值分支逻辑。如果您希望这个变量非常显式,那么可以在两种形式中使用相同的隐藏变量,并使用一个有助于您做出选择的值


这是一种方法。我相信有几种方法可以解决这个问题。

如果您有两个简单的表单,您可以使用以下方法:

创建两个不同的局部视图

@model CustomerInfoModel
@using (Ajax.BeginForm("CustomerInfo", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "info", @class = "form-horizontal" }))
    {
    <input type="text" class="form-control" name="Name" id="Name" value="@Model.Name" />
    <input type="email" class="form-control" name="Email" id="Email"  value="@Model.Email" />
    <button type="submit" id="save-info" class="btn-medium red">Save</button>
    }

在控制器中:

    [HttpPost]
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model)
    {
        if (ModelState.IsValid)
            return new Json(new { success=true, message="Updated.", errors=null);

// do you logic

        return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError"));
    }

    [HttpPost]
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model)
    {
        if (ModelState.IsValid)
            return new Json(new { success=true, message="Updated.", errors=null);

// do you logic

        return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError"));
    }
这会做你想做的事


注意:getHtmlContent方法只是生成一条要显示在页面上的错误消息。没什么特别的。如果需要,我可以与您分享。

您没有抓住要点。问题是-如果可能的话,如何只更新1个表单,而不是如何使用ViewData dictionary。对不起,老兄,我一直在读你的问题,我不明白你在问什么。我只是在问,如果有2个元素的页面在同一时间只能更新其中一个,而不触及另一个。我也不明白你在问什么。。。请你修改一下你的问题,让它有更多的上下文。您的第一个“表单”格式不正确,没有任何输入元素。。。这是干什么用的?我认为modelviewstate只更新它试图绑定的字段。。。?这是登录小部件还是登录页面?或者您是否对验证消息和验证突出显示有问题?我必须创建一些自定义的HTMLHelper扩展来处理多个表单,但我真的不知道它们是否适用于这里,因为我无法理解您的问题是什么。。。更多的信息会有帮助的。我真的很抱歉。英语也不是我的母语。我将尝试编辑问题。耶。。。尽管这个问题肯定不清楚,但这正是我想听到的:“如果您只想更新/更改其中一个表单部分,那么不使用任何一个表单部分都无法完成。”。到目前为止,似乎还没有一种干净的方法来实现asp.net mvc中的所谓小部件/这不是MVC的限制-你只是要求更新页面的一部分,所以你必须在客户端做一些事情(例如AJAX/JS),因为所有HTML表单在提交时都会根据它们的定义更改页面。问题只是点击了“流行”标记。看到我学到了这么多,我感到很惊讶。这么愚蠢的问题D
@Html.Partial("CustomerInfo", Model.CustomerInfo)
@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange)
    [HttpPost]
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model)
    {
        if (ModelState.IsValid)
            return new Json(new { success=true, message="Updated.", errors=null);

// do you logic

        return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError"));
    }

    [HttpPost]
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model)
    {
        if (ModelState.IsValid)
            return new Json(new { success=true, message="Updated.", errors=null);

// do you logic

        return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError"));
    }