【问题标题】:Values don't change after posting back to view?发回查看后值不会改变?
【发布时间】:2011-10-19 08:20:29
【问题描述】:

编辑:我已经更改了我的问题和代码以更好地阐明我的问题

我有这个(强类型视图)确实使用控制器中为该特定模型提供的值

我想从另一个模型向模型添加一些东西,从我的 httpPost 操作发回后没有任何反应...

提前致谢!

-------------------------------------- 其他代码可以进一步澄清我的问题----

 public class Address
 {
public int Id { get; set;}
public String Name { get; set;}
 }

 public class OtherAddress
 {
public int Id { get; set;}
public String Name { get; set;}
public String City { get; set;}
 }

 public class MasterModel
{
 public Address Address { get; set;}
 public List<OtherAddress> OtherAddressess { get; set;}
 }



 public ActionResult Create()
 {
 MasterModel Model = new MasterModel();
 Model.Person = new Person();
 Model.Address = new Address();
 Model.OtherAdressess = new List<OtherAddress>();

 DBContext _db = new DBContext();
 Model.OtherAdressess = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
 return View(Model);
 }

在视图中

    @model Project.Models.MasterModel

    List<SelectListItems> items = new List<SelectListItems>();

    foreach(var a in Model.OtherAddressess)
    {
        SelectListItem item = new SelectListItem();
        item.Value = a.Id.toString();
        item.Text = a.Street;
    }

    @using (@Html.BeginForm())
    {
    <div>
    <select name="otheraddress">
    foreach(var i in Items)
    {
        <option value=@i.Value>@i.Text</option>
    }
    </select>
    <input type="submit" name="select" value="Select Address"/>
    </div>
    <div>
    @Html.EditorFor(model => Model.Address.Name)
    <div>
    <p>
    <input type="submit" value="Submit"/>
    </p>
    }

在帖子中

    [HttpPost]
    public ActionResult Create(MasterModel Model)
    {
    String otherAddressSelected = Request.Params["select"];
    if(!String.IsNullOrEmpty(otherAddressSelected))
    {
        int id = int.Parse(Request.Params["otheraddress"]);
        DBContext _db = new DBContext();
        OtherAddress oa = _db.OtherAddress.Single(oa=> oa.Id == id);
        Model.Address.Name = oa.Name;
        return View(Model);
    }
    //other stuff here
    }

【问题讨论】:

    标签: asp.net-mvc-3 http-post


    【解决方案1】:

    如果您想在 [HttpPost] 控制器中更改模型的值,您必须删除要更改的实例/属性的模型状态。例如:

      [HttpPost]
      public ActionResult Index(SomeModel model)
      {
         ModelState.Remove("Name");
         model.Name = "some new name";
          return View(model);
      }
    

    this例子中得到答案

    【讨论】:

      【解决方案2】:

      我将创建一个名为 details 的操作方法,该方法将接受人员 ID 作为参数:

      public ActionResult Details(int id)
      {
         // Get person and display
      }
      

      您的 Create 操作方法用于创建 Person 类型的对象,而不是显示它们的详细信息。所以从逻辑上讲,你所做的对我来说似乎不正确。

      应该有用于显示视图的操作方法来创建一个人,以及用于将其持久化到数据库中的等效 HTTP 操作方法。

      然后我将重定向到用于显示 Person 类型对象信息的操作方法。

      return RedirectToAction("Details", new { id = Person.Id });
      

      【讨论】:

      • 感谢您抽出宝贵时间,但不是显示信息……而是在创建模型之前使用其他模型的属性填充模型。请参阅我对 Mattias 的评论。
      【解决方案3】:

      asp.net mvc 中的输入助手将使用 post 值,如果它们在查看模型之前可以找到任何值。

      在这种情况下,我认为问题在于您试图在 Create POST 操作中做不止一件事。一个动作(与应用程序中的任何方法一样)应该只做一件事。在你的情况下,我会做这样的事情(如果我正确理解工作流程):

      //Action: SelectAddress
      public ActionResult SelectAddress() {
          var addresses = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
          return View(new SelectAddressViewModel(addresses));
      }
      
      //View SelectAddress
      ....
      <ul>
          @foreach(var address in Model.Addresses) {
              <li>
                  <a href="@Url.Action("Create", "Product", new { addressId = address.Id })">
                      @Model.Name
                  </a>
              </li>
          }
      </ul>
      ....
      
      //Action Create
      public ActionResult Create(int addressId) {
          var address = _db.OtherAddress.Single(oa=> oa.Id == addressId);
          var Model = new MasterModel();
          Model.Person = new Person();
          Model.Address = new Address {
                                          Name = address.Name
                                      }
      
          return View(Model);
      }
      

      【讨论】:

      • 好的,谢谢。但是它甚至没有“看到”我的代码在操作中是不是有点奇怪......?这就像“哦,我已经得到了一些东西,如果你写在你的控制器想法中,我不会在乎”......我能做些什么来对控制器的反应方式产生更大的影响?
      • @Gyocol,说实话,我很难想出一个你真的不想要这种行为的情况。如果您发布一些内容并且不将客户端重定向到其他一些 url,那么您什么时候想要显示完全不同的数据,那么发布的是什么?首先它存在的原因是,如果您想在发布请求后再次显示相同的视图,则不需要填充整个模型(imo 这是正确的决定)。我认为如果这是一个问题,那么设计就有问题。也许您应该将用户重定向到另一个网址?
      • 假设您有另一个不属于某个人员的地址列表,但您希望使用该其他地址的某些属性填充该人员的地址,以简化填写数据的工作流程。
      • 恐怕我不明白你的工作流程。但是当您将一些数据发布到服务器时,您应该看到的是该帖子的结果。 HTTP GET 和 HTTP POST 之间有很大的区别。您在这里想要做的可能是在再次显示表单之前发出另一个 GET(重定向)到相同的 url。
      • Mattias,对不起,我想我对我的问题和代码不太清楚(如果我在表单上发布更多问题,我会尝试更好地描述我的问题)。我已经更改了我的代码,希望你能理解我想要做什么。感谢您的宝贵时间,
      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多