Привязка модели MVC Strogly типизированных частичных представлений - PullRequest
0 голосов
/ 08 сентября 2011

Я новичок в MVC, так что вот моя проблема. У меня есть родительский вид и частичный вид, который отображается внутри него. В качестве модели я передаю IEnumerable для родительского представления. Я перебираю список и для каждого элемента отображаю частичное представление, имеющее элемент списка в качестве модели. В частичном представлении у меня есть форма, которая при отправке запускает дочернее действие, которое принимает в качестве параметра тип списка. Моя проблема в том, что param всегда имеет значения null.

Это мои доменные сущности.

public class Contact
    {
        [Key]
        public int IdContacts { get; set; }
        public int UserId { get; set; }
        public int CreatedByUserId { get; set; }
        public int UpdatedByUserId { get; set; }
        public int AddressId { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public long HomePhone { get; set; }
        public long? WorkPhone { get; set; }
        public bool IsRelated { get; set; }
        public bool IsEmergency { get; set; }
        public bool IsDeceased { get; set; }
        public string Relationship { get; set; }
        public DateTime EntryDate { get; set; }
        public DateTime? ChangeDate { get; set; }
    }

 public class Address
    {
        [Key]
        public int IdAddresses { get; set; }
        public int CountryId { get; set; }
        public int StateId { get; set; }
        public int CreatedByUserId { get; set; }
        public int UpdatedByUserId { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public long PostalCode { get; set; }
        public string OfficeOrApt { get; set; }
        public int AreaGroup { get; set; }
        public int? SuperUserId { get; set; }
        public DateTime EntryDate { get; set; }
        public DateTime? ChangeDate { get; set; }
    }

Это мой вид модели

public class ContactModel
    {
        public Contact Contact { get; set; }
        public Address Address { get; set; }
        public bool IsEditMode { get; set; }
    }

Это мой родительский взгляд

@model IEnumerable<Cricket.WebUI.Models.ContactModel>
@{
    ViewBag.Title = "Contacts";
}
<h2 align="center">
    Contacts</h2>
<div class="iggr_container">
    <div class="iggr_clear">
    </div>
    @foreach (var contact in Model)
    {
        ViewDataDictionary dictionary = new ViewDataDictionary();
        string guid = (Guid.NewGuid()).ToString();
        dictionary.Add("prefix", guid);

        @Html.Hidden("Contact.Index", guid)
        @Html.Hidden("Address.Index", guid)
        @Html.Partial("ContactSummary", contact, dictionary)
        <hr style="width: 385px;" align="left" /> 
    }
</div>

Это мой частичный взгляд

@model Models.ContactModel
<div class="iggr_clear">
</div>
@if (!Model.IsEditMode)
{
    var prefixContact = "Contact[" + ViewData["prefix"] + "].";
    var prefixAddress = "Address[" + ViewData["prefix"] + "].";

    using (Html.BeginForm("Edit", "Contacts", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        TempData["ContactModelObject"] = Model;
    <div>
        <b>
            @Html.Hidden(prefixContact + "FirstName", Model.Contact.FirstName);
            @Html.Hidden(prefixContact + "LastName", new { name = "Contact" + ViewData["prefixContact"] + ".LastName" })
            @Html.LabelFor(m => m.Contact.FirstName, Model.Contact.FirstName)
            &nbsp;
            @Html.LabelFor(m => m.Contact.LastName, Model.Contact.LastName)
        </b>
        <div>
            <span>Home Phone:</span>
            @Html.Hidden(prefixContact + "HomePhone", Model.Contact.HomePhone)
            @Html.LabelFor(m => m.Contact.HomePhone, Model.Contact.HomePhone.ToString())</div>
        <div>
            <span>Work Phone:</span>
            @Html.Hidden(prefixContact + "WorkPhone", Model.Contact.WorkPhone)
            <span>
                @if (Model.Contact.WorkPhone == null)
                {
                    @:N/A
            }
                else
                {
                    @Html.LabelFor(m => m.Contact.WorkPhone, Model.Contact.WorkPhone.ToString())
                }
            </span>
        </div>
        <div>
            @Html.Hidden(prefixAddress + "Street", Model.Address.Street)
            @Html.LabelFor(m => m.Address.Street, Model.Address.Street)
        </div>
        <div>
            @Html.Hidden(prefixAddress + "City", Model.Address.City)
            @Html.Hidden(prefixAddress + "PostalCode", Model.Address.PostalCode)
            @Html.LabelFor(m => m.Address.City, Model.Address.City)&nbsp;&nbsp;@Html.LabelFor(m => m.Address.PostalCode, Model.Address.PostalCode.ToString())
        </div>
        @Html.Hidden(prefixContact + "IsRelated", Model.Contact.IsRelated)
        @if (Model.Contact.IsRelated)
        {
            <b>Family</b>
            if (Model.Contact.IsEmergency || Model.Contact.IsDeceased)
            {
            <b>/</b>
            }
        }
        @Html.Hidden(prefixContact + "IsEmergency", Model.Contact.IsEmergency)
        @if (Model.Contact.IsEmergency && !Model.Contact.IsDeceased)
        { 
            <b>Emergency</b>
        }
        @Html.Hidden(prefixContact + "IsDeceased", Model.Contact.IsDeceased)
        @if (Model.Contact.IsDeceased)
        { 
            <b>Deceased</b>
        }
        <input type="submit" name="button" value="Edit" class="iggr_button_edit" style="margin-left: 150px;" />
    </div>
    }
}

И, наконец, мой контроллер класса

public class ContactsController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        ContactsRepository repository = new ContactsRepository();

        CDE.User user = (from u in repository.Users where u.IdUsers == 1 select u).FirstOrDefault();

        var contacts = (from u in repository.Users
                       join c in repository.Contacts on new { UserId = u.IdUsers } equals new { UserId = c.UserId }
                       join a in repository.Addresses on new { AddressId = c.AddressId } equals new { AddressId = a.IdAddresses }
                       select new ContactModel()
                       {
                           Contact = c,
                           Address = a
                       }).AsEnumerable();

        return View("Contacts", contacts);
    }

    [HttpPost]
    [ActionName("Edit")]
    [@ActionFilter(ActionInvokerType = "button", ActionInvokerValue = "Edit")]
    public ViewResult Edit(ContactModel contact)
    {
        //Here contact.Contact comes as null same for contact.Address
        return View("Contacts", null);//Ignore this line
    }
}

1 Ответ

0 голосов
/ 08 сентября 2011

У меня такое ощущение, что ваша структура префикса мешает связыванию, которое обычно происходит в MVC. Вы можете использовать пользовательскую реализацию привязки модели или найти способ обойтись без ваших префиксов.

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