2012-04-16 1 views
0

У меня есть страница с некоторой проверкой на стороне сервера. Он работает, поскольку при ошибке проверки сервера он отображает одну и ту же страницу с полем с ошибками проверки над формой, в которую были введены данные.return view, но также перейти на div

Моя проблема заключается в том, что в верхней части страницы есть целая куча других вещей, поэтому пользователь не обращается к полю ошибки, на самом деле это может быть вне экрана. Ошибки находятся в div #server_errors. Я хочу сказать контроллеру вернуть представление, но перейти к разделу ошибок, так же как добавить #server_errors к URL-адресу.

возвращает контроллер, как это:

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 

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

+1

Ну, я мог видеть с помощью JS на стороне клиента для автоматической прокрутки сводки об ошибке или первой ошибки в формы, но поскольку для этого все требует JavaScript, он не будет работать с отключенным JS. Единственный способ получить хэш-тег (#server_errors) в URL-адресе - сделать переадресацию, но даже это имеет свои ограничения. –

ответ

1

Вы могли бы попробовать что-то вроде этого:

public ActionResult ChangeRiskCategory(Guid id, bool error = false) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    if (!error && !ModelState.IsValid /*or other way of working out the error will be displayed*/) 
    { 
     return Redirect(Url.Action("ChangeRiskCategory") + "?id=" + id + "&error=true#server_error"); 
    } 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 

} 

(Параметр «ошибка» должен остановить его бесконечно redir выполнения над каждым)

Если вы передумаете об использовании Javascript вы могли бы просто испускают:

location.href='#server_errors'; 
+0

Стоит отметить, что это может привести к тому, что логика проверки и загрузка страницы будут выполняться дважды для каждого сбоя, поэтому, хотя это решение отвечает на вопрос, я бы посоветовал использовать его только в «все иначе не получается "ситуация, поскольку она намного менее эффективна. Рассмотрите возможность обнаружения, если JS отключен, и только перенаправление на стороне сервера в этом случае, чтобы уменьшить это. –

1

Что касается передачи div id как свойства ViewModel в представление? Затем вы можете делать все, что хотите, с помощью Javascript в представлении. В конце концов, ViewModel представляет данные и состояние представления.

проверки на основе
+0

Спасибо Данте. В идеале я ищу что-то, что будет работать без js. –

+0

Не заметил, что часть, извините. – Dante

0

Используйте модель и есть вы смотрите выглядеть примерно так

@model SampleApplication.Models.BasicDemoModel 

<form id="AjaxForm" action="/"> 
    <table> 
     <tr> 
      <td>@Html.LabelFor(x => x.Name)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Name) 
       @Html.ValidationMessageFor(x => x.Name, "*") 
      </td> 
     </tr> 
     <tr> 
      <td>@Html.LabelFor(x => x.Email)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Email) 
       @Html.ValidationMessageFor(x => x.Email, "*") 
      </td> 
     </tr> 
     @{ 
      Html.RenderPartial("Address", Model); 
     } 
    </table> 
    @if (!string.IsNullOrWhiteSpace(Model.Message)) 
    { 
     <h2>@Model.Message</h2> 
    } 
    @if (!ViewContext.ViewData.ModelState.IsValid) 
    { 
     @Html.ValidationSummary() 
    } 
    <input type="submit" title="Submit Form" onclick="PostFormWithAjax();return false;" /> 
</form> 

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

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    ModelState.AddModelError("MyInput","This isn't Right"); 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 
+0

Я не могу получить вашу ссылку для работы –

Смежные вопросы