2016-10-18 1 views
0

내가 Umbraco를 사용한 지 오래되었습니다. 현재 형태가 많은 Umbraco 7 인스턴스를 설정합니다. ModelState를 올바르게 처리하는 데 어려움을 겪고 있습니다. 누군가 내가 잘못하고있는 것을 설명 할 수 있기를 바랍니다. 지난 며칠 동안 많은 기사를 읽었으며 이렇게하는 방법은 여러 가지가있는 것처럼 보였지만 나에게 어떤 시도도 해보지 않았습니다. 나는 지금 내가 어디에 있는지 설명 할 것이다.제출했지만 오류가있는 Umbraco 7 MVC 양식을 반환하려면 어떻게해야합니까?

public override ActionResult Index(RenderModel model) 
    { 
     var customModel = model.Content.As<MyCustomPage>(); 

     // Init the model that I want to bind to the form 
     ViewBag.EditFormModel = new EditFormModel() 
     { 
      MyProperty = "init value" 
     }; 

     return this.CurrentTemplate(customModel); 
    } 

내 폼 모델 : 내보기에서

public class EditFormModel 
{ 
    public int Id { get; set; } 

    [System.ComponentModel.DisplayName("Label")] 
    [System.ComponentModel.DataAnnotations.Required] 
    public string MyProperty{ get; set; } 
} 

: 강력한 형식의 페이지 모델 돌아 동감을 사용

내 페이지 컨트롤러

@{ 
    // Get the model returned after postback if available, otherwise the initialised model 
    var editFormModel = TempData["EditFormModel"] as LocationEditFormModel ?? ViewBag.EditFormModel as LocationEditFormModel; 
} 

@Html.Partial("CustomEditForm", editFormModel) 

그 부분보기 :

@model EditFormModel 
    @using (Html.BeginUmbracoForm("PostForm", "PostFormSurface", FormMethod.Post)) 
    { 
     @Html.ValidationSummary(false, string.Empty) 
     @Html.AntiForgeryToken() 
     @Html.EditorFor(m => m.MyProperty) 
     <input type="submit" class="btn btn-primary" value="Submit" /> 
    } 

내 표면 컨트롤러 :

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult PostForm(LocationSearchFormModel model) 
    { 
     bool passesServerSideValidation = this.Validate(model); 

     if (passesServerSideValidation) 
     { 
      // Save and perform a redirect 
     } 
     else 
     { 
      // I read something that suggested I should clear model state here but it doesn't seem to make a difference 
      ModelState.Clear(); 

      ModelState.AddModelError(string.Empty, "Not valid"); 
     } 

     // Add the model to temp data so we can retain values on postback 
     TempData["SearchFormModel"] = model; 

     return CurrentUmbracoPage(); 
    } 

문제는 내가 양식을 제출하면, 지점에서 나는 내가 예상대로 ModelState.IsValid이 거짓임을 관찰 할 수있는 라인 return CurrentUmbracoPage();을 공격한다는 것입니다. 그러나 단계별로 살펴보면 다음 줄은 페이지의 컨트롤러에있는 Index 메서드입니다. 즉시 ModelState.IsValid이 참입니다. 따라서 양식이 다시로드 될 때 유효성 검사 요약이 표시되지 않습니다.

분명히 여기서 뭔가 잘못하고 있지만 아직 읽지 않은 것은 올바른 방향으로 나를 가리키고 있습니다. 당신의 충고에 감사드립니다.

답변

0

은 우리가 기본적으로하고있는 것은 CurrentUmbracoPage을 반환하는 것입니다() 양식을하지 유효하고 단지 RedirectToCurrentUmbracoPage을 수행 할 때()이 유효이고 예를 들어 양식을 재-게시에 대한 값을 유지하는 데 필요한 아닙니다. 모델이 유효한지 확인하기 위해 ModelState을 사용하고 있습니다.

귀하의 코드를 그런 식으로 뭔가를 단순화 할 수 있습니다

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult PostForm(LocationSearchFormModel model) 
{ 
    if (ModelState.IsValid == false || !this.Validate(model)) 
     return CurrentUmbracoPage(); 

    TempData["SearchFormModel"] = model; 

    return RedirectToCurrentUmbracoPage(); 
} 

이 그것은 시험 아니에요, 비와이 티 아마이 문제를 해결하는 데 도움이됩니다.

+0

시간 내 주셔서 감사합니다.하지만 CurrentUmbracoPage()를 반환하면 내 ModelState가 내 뷰에 유지되지 않으므로 MVC의 유효성 검사 요약 등을 사용할 수 없습니다. 이제는이 문제에 대한 멋진 해결책을 발견했습니다. 시간이있을 때 여기에 게시하십시오. – getsetcode

+0

쿨! 윌 다음보세요 :) –

0

해결책을 찾았습니다.

제 설정에서 RenderMvcController 하위 유형을 통해 렌더링되는 양식이 있습니다. 이 모델은 RenderModel에서 상속받습니다.

SurfaceController 하위 유형에 게시하고 있습니다. 이 모델은 게시물에서 사용할 수없는 IPublishedContent를 필요로하므로 RenderModel을 상속받을 수 없습니다.

유효성 검사 오류가있을 때의 문제점은 ModelState를 보유한 컨트롤러 컨텍스트를 떠나지 않고 SurfaceController 모델에 기반하여 RenderMvcController가 수행해야하는 문제입니다.

SurfaceController에 View를 렌더링하기 위해 RenderModel의 인스턴스를 작성하는 데 필요한 IPublishedContent 인 CurrentPage 속성이 있음을 발견했습니다. Controller 컨텍스트를 벗어나지 않고 View를 렌더링하면 ModelState를 View에서 계속 사용할 수 있습니다.

Umbraco (또는 MVC)는 게시 된 값을 코드에서 복사 할 필요없이 재사용 할만큼 똑똑합니다.

전체 코드 예제를 만드는 것은 너무 많은 작업입니다. 그래서 SurfaceController에 액션을 공유하겠습니다. (또는 오히려 그것의 익명 버전.)

[HttpPost] 
public ActionResult Index(MySurfaceControllerModel model) 
{ 
    if (!ModelState.Isvalid) 
    { 
     return View("MyView", new MyRenderModel(CurrentPage)); 
    } 

    // Do some stuff with my valid model. 

    return RedirectToAction("thenextpage"); 
} 

나는이만큼 내가 가지고 그것을 할 수있는 방법을 찾고 다른 사람이 계속되기를 바랍니다.

관련 문제