Привязка модели в ASP.NET MVC при редактировании объекта - PullRequest
0 голосов
/ 17 января 2010

Я застрял с этим кодом:

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(FormCollection collection, [Bind(Exclude="Id,Latitude,Longitude")]Store bindStore, string Latitude, string Longitude)
    {
        Store st = storeModel.GetStore(Session["user_id"].ToString());
        bool modelUpdate = TryUpdateModel(st, new string[] { "Storename", "Address1", "Address2", "Zipcode", "City", "Phone1", "Phone2", "Store_email", "Store_homepage", "Pm_ec", "Pm_visa", "Pm_master", "Appointment_requirement", "Short_user_store_description" });

        if (ModelState.IsValid)
        {
            storeModel.Save();
            return RedirectToAction("ImageUpload");
        }
        else
            return Edit();
    }

Моя проблема в том, что я не знаю, как правильно делать привязку модели, когда мне нужны следующие условия:

  • У объекта «Store» есть несколько полей (не только Id), которые НЕ должны обновляться во время этого обновления (возникли проблемы с тем, что «TryUpdateModel» NULL-ifies все эти поля, поэтому я добавил значение «includeProperties» с открытым текстом всех параметров ... решение, которое мне все равно не нравится)
  • Получение идентификатора магазина из сеанса, так как я не хочу, чтобы он был в HTML
  • Выполнение InputValidation через DataAnnotationModel (см. Ниже)

     [MetadataType(typeof(StoreMetaData))]
     public partial class Store
     {
     }
    
     public class StoreMetaData
     {
       [Required]
       [StringLength(5)]
       public object Storename { get; set; }
     }
    

Вопрос: Это правильный подход или есть стандартное / более хорошее решение для такого рода проблем?

Ответы [ 3 ]

1 голос
/ 17 января 2010

Вам не нужно собирать форму в параметрах для запуска. И нет, updatemodel попытается обновить все поля модели, если не определен белый или черный список. Так что либо это, либо создайте свою собственную функцию для обновления объектов вашей модели.

Может быть, что-нибудь общее. который будет отражать перечисление свойств предоставленного объекта обновления и применять те, которые не равны нулю, к обновляемому объекту.

0 голосов
/ 17 января 2010

Твой путь в порядке ИМХО.

Существуют и другие варианты, но ни один из них не дает убедительного преимущества над вашей техникой.

Единственное, что я бы сделал по-другому, - это смоделируйте привязку к пользовательской ViewModel с точными полями, которые вам нужны, а затем выполните правильный код, чтобы назначить только эти значения:

public ActionResult Edit( SlimStoreViewmodel editStoreModel, string Latitude, string Longitude)
{
    Store st = storeModel.GetStore(Session["user_id"].ToString());

    if (ModelState.IsValid)
    {            
        st.Thing = editStoreModel.Thing;
        st.Thing2 = editStoreModel.Thing2;
        st.Widget = editStoreMOdel.Widget;

        storeModel.Save();
        return RedirectToAction("ImageUpload");
    }
    else
        return Edit();
 }

Это избавляет от длинных магических нитей, таких как:

TryUpdateModel(st, new string[] { "Storename", "Address1", "Address2", "Zipcode", "City", "Phone1", "Phone2", "Store_email", "Store_homepage", "Pm_ec", "Pm_visa", "Pm_master", "Appointment_requirement", "Short_user_store_description" });
0 голосов
/ 17 января 2010

Я полагаю, что, глядя на опубликованный вами код, вы пытаетесь сделать так, чтобы представление «Правка» позволяло редактировать только определенные поля, но «пропустить» те, которые вы не хотите изменять. , В этом случае вы можете изменить представление «Правка», чтобы удалить эти поля из редактирования, но при этом отправить их в форму, используя:

<%= Html.Hidden("field") %>

Дайте мне знать, если вы этого хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...