Отправка параметров URL и тела POST на контроллер MVC 2 - PullRequest
0 голосов
/ 25 мая 2010

У меня возникают некоторые проблемы при попытке сделать HTTP PUT (или POST) с использованием WebClient против контроллера MVC 2. Исключение составляет:

The parameters dictionary contains a null entry for parameter 'total'
of non-nullable type 'System.Int32' for method
'System.Web.Mvc.ActionResult Company(System.Guid, Int32, Int32, System.String)'

Действие контроллера:

[HttpPut]
public ActionResult Company(Guid uid, int id, int total, string url)

Маршрут:

routes.MapRoute(
    "CompanySet",
    "job/active/{uid}/company/{id}",
    new { controller = "Job", action = "Company" }
);

Код клиента:

var putData = Encoding.ASCII.GetBytes("total=919&url=test");
var client = new WebClient();
client.UploadData("http://localhost/job/active/1/company/2", "PUT", putData);

Как видите, я хочу отправить параметры uid и id через URL , и * 1020. * параметры ' total ' и ' url ' как часть PUT или POST body .

Я также пытался объединить последние параметры в класс (т. Е. CompanySetMessage), делая это больше не вызывает исключение, но я не получаю значения на стороне сервера.

Есть идеи? Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

Во-первых, вам нужно установить PUT или POST ActionMethodSelectorAttribute:

[HttpPut] // <- ActionMethodSelectorAttribute
public ActionResult Company(Guid uid, int id, int total, string url) 
{ // TODO: Bananas }

Пример:

Решение проблемы с использованием форм в представлении и отдельных методов для каждого запроса (предпочтительно в архитектуре ASP.NET MVC):

Изменить метод компании

    public ActionResult Company(int id)
    {
        return View(companyData.Single(x => x.Id == id)); // The filter can be anything
    }

Метод действия POST

    [HttpPost]
    [ActionName("Company")] // <- Allows to create multiple Actions with the same parameters which also refer to the same ActionName
    public ActionResult Company_Post(Guid uid, int id, int total, string url)
    {
        return Content(
            String.Format("POST Values:<br />Guid: {0}<br /> Id: {1}<br /> Total: {2}<br /> Url: {3}", uid, id, total, url)
        );
    }

Код представления POST (это строго типизированное представление для типа «Компания»)

    <% using (Html.BeginForm()) {%>

        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Uid) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Uid)%>
                <%: Html.ValidationMessageFor(model => model.Uid)%>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Id) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Id) %>
                <%: Html.ValidationMessageFor(model => model.Id) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Total) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Total) %>
                <%: Html.ValidationMessageFor(model => model.Total) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Url) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Url) %>
                <%: Html.ValidationMessageFor(model => model.Url) %>
            </div>

            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>

    <% } %>

Вывод POST

POST Values:
Guid: 12345678-1234-1234-1234-123456789012
Id: 1
Total: 10
Url: #1

Как видите, все значения отправляются обратно в контроллер. (Без необходимости сначала собирать / инициализировать их)


Метод действия PUT

    [HttpPut]
    [ActionName("Company")] // <- Allows to create multiple Actions with the same parameters which also refer to the same ActionName
    public ActionResult Company_Put(Guid uid, int id, int total, string url)
    {
        return Content(
            String.Format("PUT: Values:<br />Guid: {0}<br /> Id: {1}<br /> Total: {2}<br /> Url: {3}", uid, id, total, url)
        );
    }

PUT View Code (тот же вид, что и выше, только слегка измененный

    <% using (Html.BeginForm()) {%>
        <%: Html.HttpMethodOverride(HttpVerbs.Put) %> // <- Only this one is new, it renders a different form
        <%: Html.ValidationSummary(true) %>
        ...

PUT Просмотр визуализированного HTML-кода

    <form action="/dataentry/Company/1" method="post"><input name="X-HTTP-Method-Override" type="hidden" value="PUT" /> 

PUT Output

PUT: Values:
Guid: 12345678-1234-1234-1234-123456789012
Id: 1
Total: 10
Url: #1

Это был бы строго типизированный и безопасный способ отправки данных назад и вперед от контроллера и представлений. Сопоставление опубликованных / введенных значений выполняется платформой MVC автоматически. Поэтому, если вам нужно что-то изменить в своей модели Домена, вам нужно всего лишь добавить новые поля в ваше представление и настроить параметры метода.

Даже если это не то, что вы хотели, я все же думаю, что не так уж и плохо, когда его где-то записали: -).

0 голосов
/ 25 мая 2010

Неважно, очевидно, это была проблема на стороне клиента, а не на стороне сервера.

Я только что изменился

client.UploadData

для

client.UploadValues

, используя NameValueCollection, и теперь он работает нормально.

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