문제

게시하려는 형태로 자란 문제가 있습니다. 양식이 검증되지 않는 시나리오에서는 표준 전화 경로를 사용하고 있습니다. ModelState.AddModelError() 그런 다음보기 결과를 반환합니다.

문제는 HTML입니다.* 헬퍼는 렌더링 할 때 게시 된 값을 선택해야하며 텍스트 필드가 PostBack 조치의 매개 변수 목록에 포함 시켜서 만 표시되는 경우에만 영향을 미치지 않아야합니다. 일부 형태로 보는 것은 너무 많은 필드를 가지고있어서 모두 매개 변수로 나열하려고합니다.

내 행동 코드는 대략 :

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
    var dataDefinition = ...

    // do some validation stuff
    if (!ModelState.IsValid)
    {
        // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
        // ...
        return View(dataDefinition);
    }

}

이제 DatadeFinition (LINQ에서 SQL Entity)이 필드가 있습니다. Minvolume,이 줄에 의해보기에서 처리됩니다.

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>

그러나 실패한 ModelState 유효성 검증 후보기가 렌더링되면 Postback 메소드에 매개 변수로 포함하지 않으면 게시 한 원본 페이지에 입력 된 값은 보존되지 않습니다. 말 그대로, 나는 이것을함으로써 "문제를 해결"할 수 있습니다.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)

어떤 이유로 든 필드 값이 보존되도록합니다. 내 양식은 그보다 더 많은 가치를 가지고 있기 때문에 이것은 나에게 어리석은 것처럼 보이며 해당 필드에 대한 매개 변수를 추가 할 필요는 없습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

코드가 될 수 있습니다.

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>

.. null 기본값 PARAM? 아마도 당신이 바꾸면 null 에게 Model.MinVolume 그것은 가치를 지속 할 것입니다. 이와 같이:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%>

당신의 행동이 값을 반환하는지 확실하지 않습니다 MinVolume 모델에서. 그렇다면 위의 작업이 작동해야합니다. 그렇지 않으면 작업을 약간 리팩터링해야 할 수도 있습니다.

다른 팁

오, 방금 응용 프로그램 디자인을 개선했습니다. 사용자 정의 검증이 있기 때문에 문제가 발생합니다 (나도 있습니다). 당신은 후에 추가해야합니다

ModelState.AddModelError()

이것

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);

고려할 때 그것은 있어야합니다

Mimum:<%=Html.Textbox("MinVolume")%>

왜 그것이 작동하는지 확실하지 않지만 그것은 나를 위해 효과가있었습니다.

오류의 ModelSTate에서 값을 설정할 때 사용하는 키는 무엇입니까? 텍스트 상자의 값 매개 변수를 설정하는 코드는 다음과 같습니다.

관련 부분 다운로드 프레임 워크 코드.

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

시도 값이 존재하는지 알 수 있듯이, 동일한 키를 사용할 수있는 경우에만 사용됩니다.

나는 매개 변수가없고 ValueProvider에서 직접 값을 가져 오는 동작이 있기 때문에 이것이 효과가 있다는 것을 알고 있으며, AddModelError를 사용하여 유효성 검사 오류를 나타냅니다. 내 텍스트 상자의 값이 유지되었다고 확신합니다.

편집하다: 값을 유지하려면 어떤 방식 으로든 모델과 연관되어야합니다. 이를 수행하는 한 가지 방법은 매개 변수 목록에 추가하는 것입니다. 또 다른 방법은 updateModel (화이트리스트의 매개 변수 이름 또는 화이트리스트 없음)을 사용하는 것입니다. 세 번째 방법은 @jenea의 답변에서와 같이 매개 변수를 모델에 명시 적으로 추가하는 것입니다. 도우미는 모델 상태에서만 당기기 때문에 값을 유지하려면 거기에 있어야합니다. 요청의 양식 속성을 보지 않습니다.

해결책은 다음과 같습니다.

[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(int id, FormCollection form)
{
    T itemToUpdate = repository.Get(id);
    UpdateModel(itemToUpdate, form.ToValueProvider());

    if (itemToUpdate.IsValid())
    {
        repository.SaveOrUpdate(itemToUpdate);
        return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
    }

    repository.DbContext.RollbackTransaction();
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
}

행운을 빕니다!

또 다른 솔루션은 다음을 입력하는 경우입니다.

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>

ASP.NET MVC에서 Postback을 처리하는 다양한 방법을 보려면이 기사를 참조하십시오.

링크 텍스트

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top