MVC3 - Отправка пользовательских атрибутов ввода на кнопку ввода при отправке формы - PullRequest
0 голосов
/ 30 сентября 2011

В основном у меня есть форма, к которой я динамически добавляю объекты. Я делаю это с AJAX, поэтому могу просто инициализировать объект и вернуть его с JSON. Каждому новому объекту присвоен уникальный GUID, поэтому мы можем идентифицировать каждый объект в коллекции моделей, когда он возвращается в действие.

Однако мне нужно поддерживать не JavaScript, поэтому я пытаюсь написать решение, которое отправит обратно модель и добавит или удалит данный объект из модели. В модели может быть любое количество этих новых объектов, поэтому мне нужно передать несколько вещей, чтобы выяснить, какой объект удалить, прежде чем возвращать модель обратно в представление. Это может быть либо

a) GUID для объекта, который пользователь удалил.

b) Кнопка, на которую нажали, чтобы определить, какой объект удалить.

Проблема в том, что частичное представление является общим, и я хотел бы сохранить его таким образом, поэтому я пытаюсь передать идентифицирующий GUID обратно с помощью кнопки ввода в каждом частичном представлении, но не знаю как. Я легко могу сделать это с помощью JavaScript, потому что я просто удаляю созданный объект AJAX со страницы, прежде чем публиковать его, когда пользователь нажимает на ссылку удаления, но не может понять, как это сделать с отправкой. В основном я хочу сделать что-то вроде этого:

@using (Project.Namespace.Infrastructure.Helpers.HtmlPrefixScopeExtensions.HtmlFieldPrefixScope _scope = Html.BeginCollectionItem())
{
<ul class="ulMedicationsControl">
    @Html.ActionLink("Remove This Object", "RemoveObject", null)

    @Html.Input("RemoveObject", "Remove This Object", new { Prefix = _scope.Prefix, objectGUID = IdentifyingGUID })

 @Html.HiddenFor(m => m.IdentifyingGUID);

    <li class="liQuestion">
        @Html.MandatoryLabelFor(m => m.myField)
        @Html.TextBoxFor(m => m.myField)
    </li>

</ul>

<div id="@(_scope.Prefix).ajaxPlaceholder"></div>
}

В контроллере:

[ActionName("FormName")]
[AcceptParameter(Name = "RemoveObject", Value = "Remove This Object")]
public ActionResult RemoveObject(MyParentModel model, string Prefix, string objectGUID)
    {

        Guid ID = new Guid(objectGUID);

        foreach (ObjectModel object in model.objects){
            if (object.IdentifyingGUID  == ID)
            {
                model.objects.Remove(object);
                break;
            }
        }

        return View(model);
    }

Любая помощь, которую я очень ценю, поскольку я просто не могу понять, как это сделать!

EDIT

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

1 Ответ

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

Ввод HTML передает «name = value» только тогда, когда происходит публикация формы, так что это все, с чем вам нужно работать.С <input type=submit> вы еще более ограничены тем фактом, что value кнопки является ее заголовком (т. Е. «MyControl = Click Me!» Опубликован), поэтому вы не можете вставить в значение ничего программно значимого.

Метод 1: Таким образом, у вас остается кодирование всей необходимой информации в name ввода - подход, который отлично работает, но вам придется копатьв параметр FormCollection метода действия контроллера, а не полагаться на привязку модели.Например:

<input name="delete$@(_scope.Prefix)$@objectGUID" type="submit" value="Delete me" />

Лучше иметь вспомогательный класс, который инкапсулирует строковый формат с переопределением ToString и имеет статические методы Parse / TryParse / etc, которые можно использовать следующим образом:

<input name="@(new DeleteToken{Prefix=_scope.Prefix, objectGUID=IdentifyingGUID})"  type="submit" value="Delete me" />

В вашем методе действий:

[HttpPost]
public ActionResult Foo(FormCollection formData) 
{
    var deleteTokens = DeleteToken.ParseAll(formData.AllKeys);
    foreach (var token in deleteTokens)
    {
        //...do the deletion
    }
}

Метод 2: Альтернативный подход - группировать каждый элемент в отдельный <form> (имейте в виду, что вы не можете вкладывать формы) - поэтому, когда происходит отправка, публикуется только окружающая форма, в которой вы можете хранить скрытые данные с необходимыми данными.например,

<ul class="ulMedicationsControl">
    <form ... >
        <!-- hidden field and submit button and whatever else here -->
        ...
    </form>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...