1

我在一个包含用户详细信息的视图中有一个 Html.BeginForm:名字、姓氏、电子邮件等。然后我有 2 个按钮。批准和拒绝

单击批准后,我转到一个视图。

当拒绝时,我去另一个。

处理哪个被点击的最佳方法是什么?

在我看来:

<% using (Html.BeginForm("PublishGroupsForRecommendedUser", "Recommend", FormMethod.Post, new { id = ViewBag.UserId }))
  { %>
   <div class="section _100">
    <%: Html.LabelFor(model => model.Email)%> 
    <div>                                      
      <%: Html.EditorFor(model => model.Email)%>  
      <%: Html.ValidationMessageFor(model => model.Email)%>    
    </div>
   </div>            

   //etc

 <input type="hidden" name="action">
 <div class="actions">
  <div class="actions-right">
    <input type="submit" value="Approve" class="submit_button" />
  </div>
  <div class="actions-left"> 
    <input type="submit" value="Reject" class="submit_button" />
  </div>
  </div>
  <% } %>

在我的控制器中:

   [HttpPost]
  public ActionResult PublishGroupsForRecommendedUser(int userId)
  {
    var recommendedUser = ZincService.UserService.GetRecommendedUserForId(userId);
    var visibleGroups = ZincContext.CurrentUserGroups.Get();
    var groupEntities = ZincService.GroupService.GetVisibleGroupsForUser(CurrentUser.UserId).ToList();

    var viewModel = GetGroupPublishingViewModelForSelectedGroups(
    recommendedUser.RecommendedUserId, Zinc.Enums.PublishingMode.ParticipatingGroupUsersOnly,
    recommendedUser.Email, groupEntities);

    return View(viewModel);
  }


  [HttpGet]
  public ActionResult RejectUser(RecommendUserViewModel model)
  {
    Entities.RecommendedUser user = new RecommendedUser();
    user.ReasonForRejection = model.ReasonForRejection;
    ZincService.UserService.UpdateRecommendedUser(user);
    return View(user);
  }

所以我不能再使用这条线(Html.BeginForm("PublishGroupsForRecommendedUser", "Recommend", FormMethod.Post, new { id = ViewBag.UserId }))了,因为根据点击了哪个按钮,我需要转到PublishGroupsForRecommendedUserorRejectUser操作,这反过来又会调用相应的视图。

有人可以推荐我最好的方法吗?

4

3 回答 3

3

我不完全确定你想要什么,但我认为一些重组会帮助你的代码:

ASP.NET-MVC 通过为您的视图使用特定的 ViewModel,可以轻松处理来自表单的输入。为您要回发的所有内容创建一个属性:

您制作了一个简单的 POCO 对象,例如:

public class Person {
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsApproved { get; set; }
}

ID 在模型中的位置比在 ViewBag 中要好得多。它是模型的一部分,不要害怕把它放在那里。它也将在获得帖子结果时填写。很方便。

假设您的第一个操作是:

public ActionResult PersonForm()
{
    var model = new Person()
    {
        ID = WhateverYouWant()
    };

    return this.View(model);
}

您可以将其用作视图中的模型:

<%@ Page Title="Anything" Language="C#" Inherits="System.Web.Mvc.ViewPage<MVC3ASPX.Models.Person>"... %>
...
...
<% using (Html.BeginForm())
   { %>
<%: Html.ValidationSummary(true) %>
<%: Html.HiddenFor(model => model.ID)%>
<div>
    <%: Html.LabelFor(model => model.Name)%>
    <div>
        <%: Html.EditorFor(model => model.Name)%>
        <%: Html.ValidationMessageFor(model => model.Name)%>
    </div>
</div>
<div>
    <%: Html.LabelFor(model => model.Age)%>
    <div>
        <%: Html.EditorFor(model => model.Age)%>
        <%: Html.ValidationMessageFor(model => model.Age)%>
    </div>
</div>
<% } %>

请注意我是如何为 ID 创建一个隐藏的输入字段的。它会被发回。

另请注意,我没有指定方法(获取或发布)。Post 是默认设置,它足以满足我们的需求。我也没有指定在哪里发布它。默认情况下,表单将回发到它所在的 url。在我们的例子中,这将是 action PersonForm

发布 2 种方式不是 ASP.NET 中的最佳实践。发布到一个操作并在if那里决定要做什么。

所以做2个按钮。s在提交<button>内容方面比 s 更灵活,因为它们可以有不同的文本和值。<input>

<div class="actions">
    <div class="actions-right">
        <button type="submit" name="IsApproved" value="True" class="submit_button">Approve</button>
    </div>
    <div class="actions-left">
        <button type="submit" name="IsApproved" value="False" class="submit_button">Reject</button>
    </div>
</div>

请注意,按钮将包含文本"Approve"and "Reject",但返回的值将是Trueor False,具体取决于您单击的位置。

您处理帖子的操作应如下所示:

    [HttpPost]
    public ActionResult PersonForm(Person model)
    {
        if (this.ModelState.IsValid) // Validation never hurts
        {
            if (model.IsApproved)
            {
                return this.PersonFormApproved(model); // Your first method goes here
            }
            else
            {
                return this.PersonFormRejected(model); // Your second goes here
            }
        }

        return this.View(model); // If the model's state is invalid, let's try this one more time!
    }

model变量中,您将使用表单的值填充每个属性。此外,由于有一个名为 IsApproved 的属性,它将由同名的表单元素填充。按钮。而且只有被压的那个。

请注意,我已将大部分内部逻辑提取到方法:PersonFormApprovedPersonFormRejected. 这些应该是私有的,以避免程序错误地认为它们是可调用操作的意外调用。

他们应该返回ActionResult,因为PersonForm动作会返回他们的结果。

还要检查ModelState.IsValid。仅在信息有效时处理信息。查看DataAnnotations,了解您希望如何验证模型。

于 2013-05-02T13:39:48.723 回答
0

在我看来:

<asp:Content ID="Content2" ContentPlaceHolderID="ScriptPlaceHolder" runat="server">

<script type="text/javascript">
 function RejectUser(userId) {
   $.ajax({
     url: '<%= Url.Action("RejectUser", "Recommend") %>',
     type: 'GET',
     dataType: 'json',
     data: { id: userId, reasonForRejection: $('#textarea').val() },
     success: function (data) {
       window.location.href = data.redirectTo;
     }
    });
 }
</script>

</asp:Content>

<div class="actions">
   <div class="actions-right">
      <input type="submit" value="Approve" class="submit_button" />
   </div>
   <div class="actions-left">      
      <a href="javascript:RejectUser(<%: Model.RecommendedUserId %>);" class="button" id="submit_button">Reject</a>
   </div>
</div>

在控制器中:

   [HttpGet]
  public JsonResult RejectUser(int id, string reasonForRejection)
  {
    if (!String.IsNullOrWhiteSpace(reasonForRejection))
    {
      Entities.RecommendedUser user = new RecommendedUser();
      user = ZincService.UserService.GetRecommendedUserForId(id);
      user.ReasonForRejection = reasonForRejection;
      ZincService.UserService.UpdateRecommendedUser(user);
      ZincService.SaveChanges();
    }
    return Json(new
    {
      redirectTo = Url.Action("RecommendedUsers"),
    }, JsonRequestBehavior.AllowGet);
  }

谢谢大家!

于 2013-05-06T11:02:12.083 回答
0

如果您使用 jquery,一种解决方案可能是,

给表单一个 id,并将元素中两个提交按钮的操作 url 设置为数据属性。

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "my-form" }))
{
    //form elements

    <input type="submit" name="action" value="Approve" data-action="@Url.Action("Approve", "YourController")" />
    <input type="submit" name="action" value="Reject" data-action="@Url.Action("Reject", "YourController")"/>
}

然后使用 jquery 附加提交按钮单击事件并将操作附加到表单。

$(function () {
    $('#my-form :submit').click(function (e) {
        var button = $(this);
        button.closest('form').attr('action', button.attr('data-action'));
    });
});

希望这可以帮助。

于 2013-05-02T15:32:16.173 回答