【问题标题】:which is the best way to maintain controls values during post back in MVC4?在 MVC4 回发期间维护控件值的最佳方法是什么?
【发布时间】:2016-05-03 04:18:08
【问题描述】:

目前我正在使用 ViewData 和 Viewbag 来存储数据和用于重定向的临时数据都工作正常。

我只是想知道在 MVC 中回发期间是否有任何优化方式来存储数据或控制值?

这是我的控制器方法,我将两个模型类从控制器传递到使用动态对象的视图。

    [HttpGet]
    public ActionResult Index(int? page)
    {

        IList<Customer> _CustomerList = new List<Customer>();
        IList<LCOddl> LCODDL= new List<LCOddl>();

        // some logic to bind both classed with database ..

        dynamic DashboardClassed = new ExpandoObject();
        DashboardClassed.LCODDL = LCODDL;
        DashboardClassed.CUSTOMER = _CustomerList.ToPagedList(page ?? 1, 30);

   return View(DashboardClassed);          

    }

这是我使用动态对象的剃刀视图:

@using PagedList;
@using PagedList.Mvc;
@model dynamic
@{
    Layout = null;
 }
 @using (Html.BeginForm("SearchMethod", "Dashboard", FormMethod.Post))
                            {
 @foreach (Models.LCOddl item in Model.LCODDL)
     {
        // Render HTML
     }

 @foreach (Models.Customer item in Model._CustomerList )
     {
        // render html 
     }
<div class="form-group"><button type="submit" class="btn btn-success">Go</button></div>

   }

从我的剃刀视图中单击按钮后,仪表板控制器中的 SearchMethod 将调用 .

现在我想要两件事:

  1. 不想再次将客户类与数据库绑定 - 因为我正在使用 tempdata。
  2. 我必须使用 PagedList 维护分页。

我的问题还是一样,我应该使用 tempdata 来存储数据还是有任何其他优化方法可以做到这一点。

【问题讨论】:

  • 尝试将其绑定到model..
  • 你的意思是使用模型类从数据库中获取数据?
  • 一次从数据库中获取它或通过表单从客户端接受它。它将在postback 上出现。这就是model 的工作原理。在不知道您要达到的目标或代码外观的情况下,我们无法在此处给出确切的建议..
  • @vinodsaini 你需要提交一些代码。这是一个有效的问题,但您需要展示一些东西才能得到回答。征求建议不会给你答案。这个问题之前在 SO 上已经被问过很多次了。我提供了一个简单的答案。

标签: asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

在回发期间保留表单值的最佳方法是将视图绑定到view model

我写了一个关于什么是视图模型的答案,请去阅读:

What is ViewModel in MVC?

让我们一步一步来。我不知道你想要达到什么目的,所以我将使用我自己的例子。让我们假设您正在尝试添加新用户。

首先为表单数据创建视图模型。您的视图模型与您的域模型不同,因为它只包含您要在视图上使用的数据。有时您的域模型可能包含大量数据,但您不想添加或编辑所有内容。因此,您创建的视图模型仅包含您要添加或编辑的数据。在我们的示例中,我只想为我的用户添加名字和姓氏,因此我将创建 2 个属性,即 FirstNameLastName

public class UserViewModel
{
     public string FirstName { get; set; }

     public string LastName { get; set; }
}

上述视图模型将被实例化并从您的操作方法传递给视图。当您的表单发布时,您的操作方法将接收此视图模型作为参数。它将包含名字和姓氏的值(如果输入):

public class UserController : Controller
{
     private IUserRepository userRepository;

     public UserController(IUserRepository userRepository)
     {
          this.userRepository = userRepository;
     }

     public ActionResult Create()
     {
          UserViewModel model = new UserViewModel();

          return View(model);
     }

     [HttpPost]
     public ActionResult Create(UserViewModel model)
     {
          // Do some form validation
          if (!ModelState.IsValid)
          {
               return View(model);
          }

          // If form validation succeeds do what you need to do
     }
}

在您的创建视图中,它将接收此视图模型。然后,您需要做的就是创建一个表单,其中包含 2 个用于名字和姓氏的文本框以及一个提交按钮:

@model YourProjectName.ViewModels.UserViewModel

@using (Html.BeginForm())
{
     <div>
          @Html.TextBoxFor(m => m.FirstName, new { maxlength = "50" })
          @Html.ValidationMessageFor(m => m.FirstName)
     </div>
     <div>
          @Html.TextBoxFor(m => m.LastName, new { maxlength = "50" })
          @Html.ValidationMessageFor(m => m.LastName)
     </div>
     <div>
          <button type="submit">Save</button>
     </div>
}

这确实是一个基本示例。浏览它,玩弄代码,以便您可以将其实现到您的场景中。

【讨论】:

  • 感谢@Brendan Vogt 会尝试这个并回复您。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多