Значения не меняются после публикации для просмотра? - PullRequest
2 голосов
/ 19 октября 2011

Изменить: я изменил свой вопрос и код, чтобы лучше уточнить мой вопрос

У меня есть это (строго типизированное представление), которое использует значения, предоставленные в контроллере для этой конкретной модели

Я хочу добавить что-то в модель из другой модели, после отправки сообщения из моего действия 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
    }

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Если вы хотите изменить значение вашей модели в контроллере [HttpPost], вам нужно удалить состояние модели для экземпляра / атрибута, который вы хотите изменить.Например:

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

Получил ответ от этот пример

0 голосов
/ 19 октября 2011

Я бы создал метод действия с именем details, который бы принимал идентификатор человека в качестве параметра:

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

Ваш метод действия Create предназначен для создания объектов типа Person, а не для отображения их деталей. Так что логически то, что ты делаешь, мне не кажется правильным.

Должен существовать метод действия для отображения представления для создания пользователя и эквивалентный метод действия HTTP для сохранения его в базе данных.

Затем я бы перенаправил метод действия для отображения информации об объекте типа Person.

return RedirectToAction("Details", new { id = Person.Id });
0 голосов
/ 19 октября 2011

Помощники ввода в asp.net mvc будут использовать значения записей, если они смогут их найти, прежде чем смотреть на модель.

В этой ситуации я думаю, что проблема в том, что вы пытаетесь сделать большеодна вещь в действии Создать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...