asp.net mvc.Привязать ViewModel к элементам в коллекции - PullRequest
3 голосов
/ 09 ноября 2010

Я могу привязать свойства в ViewModel довольно просто, например так:

<%=Html.RadioButtonFor(m => m.isCool, true%>cool<br/>
<%=Html.RadioButtonFor(m => m.isCool, false)%>not cool<br/>

, но что если я захочу привязать элементы коллекции в ViewModel.Я не уверен, если это возможно.Вот что у меня есть:

Моя ViewModel:

namespace MvcApplication3.ViewModels
{
    public class cpApprovalViewModel
    {
        // My internal class
        public class PersonImage
        {
            public bool isApproved { get; set; }
            public bool isProFilePic { get; set; }
            public string uriId { get; set; }
            public string urlPath { get; set; }
        }

        public string displayName { get; set; }
        public bool isCool { get; set; }
        public List<PersonImage> personImages { get; set; }
    }
}

Мой контроллер:

public class cpApprovalController : Controller
    {
        //
        // GET: /cpApproval/

        public ActionResult Index()
        {
            cpApprovalViewModel viewModel = new cpApprovalViewModel();
            viewModel.displayName = "jon doe";
            viewModel.personImages = new List<cpApprovalViewModel.PersonImage>()
            {
                new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "1", isProFilePic = false, urlPath="someImagePath1.jpg" },
                new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "2", isProFilePic = false, urlPath="someImagePath2.jpg" },
                new cpApprovalViewModel.PersonImage(){isApproved = false, uriId = "3", isProFilePic = false, urlPath="someImagePath2.jpg" }
            };

            return View(viewModel);
        }

        //cpApprovalViewModel viewModel
        [HttpPost]
        public void formReceiver(cpApprovalViewModel viewModel)
        {
            // This is where I'd like to get access to the changed personImages (approved/disapproved )
        }
    }

Мой вид:

<%: Model.displayName %><br /><br />
<% using (Html.BeginForm("formReceiver", "cpApproval", FormMethod.Post )){ %>

    <% foreach (var anImage in Model.personImages){ %>
        <%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), true, new { id = anImage.uriId })%> Approve <br />
        <%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), false, new { id = anImage.uriId })%> Deny <br />
        <hr />
    <% } %>

    <input type="submit" value="Save" />
<%} %>

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

Я пытаюсь сделать что-то невозможное здесь?Я надеюсь это имеет смысл.Спасибо.

1 Ответ

1 голос
/ 09 ноября 2010

Да - то, что вы пытаетесь сделать, возможно.

Я думаю, что ваша проблема в том, что вы пытаетесь снова получить соответствующее изображение, используя .Single, когда у вас уже есть элемент в цикле foreach.

Попробуйте изменить:

<%: Html.RadioButtonFor(model => model.personImages.Single(i => i.uriId == anImage.uriId), true, new { id = anImage.uriId })%> Approve <br />

Кому:

<%: Html.RadioButtonFor(model => anImage, true, new { id = anImage.uriId })%> Approve <br />

Подробнее о привязке модели к Коллекции здесь .

...