2012-05-23 3 views
4

이것은 첫 번째 질문으로 여기에 게시되어 있으므로 누락 된 부분이 있으면 용서해주십시오. 요청한 모든 정보로 업데이트하겠습니다.C# MVC 3 특정보기에 실패한 유효성 검사

내가 처음으로 C#을 닷넷 MVC-3 응용 프로그램에서 일하고 있어요

설명. Entity Framework 4.0과 Razor 뷰 엔진을 사용하고 있습니다.

대부분의보기에서 부분 클래스 인스턴스가 포함 된보기 모델을 사용합니다. 그 부분 클래스는 EF 클래스에서 파생되며 해당 클래스 멤버에 대한 데이터 주석을 포함합니다. 이것은 꽤 매끄럽게 작동했으며, 이제 뷰 모델을 사용하는 모든 뷰는 영향을받는 텍스트 상자에 대한 유효성 검사를 수행합니다. 예 :

부분 클래스 :

[MetadataType(typeof(DataPackageMetaData))] 
public partial class DataPackage 
{ 
    //empty 
} 

public class DataPackageMetaData 
{ 
    [Required] 
    [StringLength(50)] 
    public string DataPackageID { get; set; } 

    ... (a lot more stuff like this) ... 
} 

뷰 모델 ". 단지 작동"

public class PackageInfo 
{ 
    // Registration Package information 
    public DataPackage package { get; set; } 
    public Reviewer reviewer { get; set; } 
    public PackageTracking trackingSave { get; set; } 

    <...> 

    //Constructor 
    public PackageInfo() 
    { 
     package = new DataPackage(); 
     reviewer = new Reviewer(); 
     trackingSave = new PackageTracking(); 
    } 
} 

그래서, 그 물건에 대한 검증 물건의 모든 보기 (실제로 부분 뷰의 일부)에서 "TextBoxFor"를 넣습니다. 검증이 실패 할 경우 다음 멋진 오류 메시지가 빨간색으로 게시 :

보기 :

@Html.TextBoxFor(model => Model.package.DataPackageID, new { @class = "short", @id = "DataPackageID" }) 
@Html.ValidationMessageFor(model => Model.package.DataPackageID, "The Data Package ID is required and cannot be longer than 50 characters") 

문제

제가하는 데 문제는 지금이된다는 것입니다 프로그램의보고 측면으로 이동, 나는 사용자 정의 보고서 쿼리를 생성 할 수 있도록 "DateIn"및 "DateOut"양식 값 (다른 것들 중에서도)을 전달할 수있는 새로운 ViewModel을 원합니다. 나는 DateIn과 DateOut 값이 실제로는 날짜 값임을 검증 할 수 있기를 원합니다. 어떤 이유로이 작동하지 않습니다.

뷰 모델 :

public class PackageVals 
{ 
    <...> 

    // Date value for formatted "Date In" value 
    [DataType(DataType.Date)] 
    [DisplayName("Date In")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    [Required] 
    public DateTime DateIn { get; set; } 

    // Date value for formatted "Date Out" value 
    [DataType(DataType.Date)] 
    [DisplayName("Date Out")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    [Required] 
    public DateTime DateOut { get; set; } 

    <... more stuff ...> 
} 

보기 모든 경우에 그때 다른 뷰에 포함 된 부분 뷰를 사용하고 있음을

@Html.TextBoxFor(model => Model.DateIn, new { @class = "small", @id = "DateIn"}) 
@Html.ValidationMessageFor(model => Model.DateIn, "A valid date must be entered in the format mm/dd/yyyy.") 
<...> 
@Html.TextBoxFor(model => Model.DateOut, new { @class = "small", @id = "DateOut"}) 
@Html.ValidationMessageFor(model => Model.DateOut, , "A valid date must be entered in the format mm/dd/yyyy.") 

참고. 앱의 보고서 생성 섹션에는 여러 가지 다른보기가 있으며 거의 ​​모든 보고서에는 'DateIn'및 'DateOut'양식 값이 필요합니다.

나는 지금보고있는 것을 다 써 버렸고 시간을 들여다 보았습니다. 지금은 컨트롤러에서 잘못된 날짜 값을 오류 트래핑하고 null ViewModel을 전달하여 사용자가 볼 수 없도록합니다. 죽음의 노란색 화면.

나는 유효성 검사가 jQuery에 기반을두고 있지만, 나는 거기에 문제가 발생할 수있는 아무것도하지 않는다고 생각한다.

jQuery를 스크립트

$(document).ready(function() { 
    // Purple box autocomplete Stuff 
    $("#Product").autocomplete({ source: '/SharedFunctions/AutoFillProduct' }); 
    $("#ActiveIngredient").autocomplete({ source: '/SharedFunctions/AutoFillActiveIngredient' }); 
    $("#Applicant").autocomplete({ source: '/SharedFunctions/AutoFillApplicant' }); 

    // Purple box autocomplete Stuff 
    $("#DataType").autocomplete({ source: '/SharedFunctions/AutoFillDataType' }); 

    // Purple Box datepicker stuff 
    $("#DateReceived").datepicker({ dateFormat: "mm/dd/yy" }); 
    $("#OutDate").datepicker({ dateFormat: "mm/dd/yy" }); 

    // Silver box datepicker stuff; Also used by Reports 
    $("#DateIn").datepicker({ dateFormat: "mm/dd/yy" }); 
    $("#DateOut").datepicker({ dateFormat: "mm/dd/yy" }); 

    // Alternate table row colors 
    $("table.center > tbody tr:even").css("background-color", "#F2F8FF"); 
}); 

당신이 좋은 것이 아웃내는 저를 줄 수있는 어떤 도움 : 여기 내 전체 jQuery를 스크립트입니다.니가 필요로하는 것이 있으면 알려줘.

다시 한번 감사드립니다. (PackageInfo라고도 함) 첫 번째 뷰 모델 엔티티 프레임 워크 모델에서 만든 개체의 인스턴스를 포함 : 나는 두 ViewModels이 :

정보 추가 나는 어떤 혼란이있을 경우, 명확하게 원했다. PackageInfo의 값은 구운 "간단한"MVC 유효성 검사를 통해 뷰에서 올바르게 확인됩니다.

두 번째 ViewModel (PackageVals)에는 DateTime 값이 들어 있습니다. PackageVals의 값의 유효성이 뷰에서 확인되지 않습니다.

+0

받고있는 오류가 무엇입니까 :

여기에 작동하는 코드는? –

+1

또한'DisplayFormat' 속성의 값이'{0 : dd/MM/yyyy} '임을 확인하는 동안 형식이'mm/dd/yyyy'이어야한다고합니다. 이게 의도적 이었나요? –

+0

오류가 나타나는 유일한 시간은 양식 값이 전달되고 날짜 값이 아닌 경우입니다. 예를 들어 DateIn 필드에 "24ashugfdahu9ahgahui"를 전달하면 'String이 유효한 DateTime으로 인식되지 않습니다.'오류가 발생합니다. 나는 오류를 결코 통과하지 못하도록 컨트롤러의 try-catch 블록을 트래핑하지만, 사용자는 왜 응답을 얻지 못했는지 결코 알지 못합니다. – War2d2

답변

0

컨트롤러에 문제가 발생하여 위 코드에 게시되지 않았습니다. 나는 처음에 그 글을 게시했다면 @Mystere Man이나 나를 도와 주려고하는 친절한 사람들이 즉시 그것을 집어 들었을 것이라고 생각한다.

컨트롤러 변수의 인수가 모델 변수가 아닌 FormCollection 변수로 설정되어 결과적으로 모델의 유효성 검사를 거치지 않고 데이터가 전달되는 결과가 발생했습니다.

[HttpPost] 
    public ActionResult RptPkgsRecd(PackageVals model) 
    { 
     ViewBag.CurrentPage = "reports"; 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       PackageVals pv = new PackageVals(); 
       pv.dps = regpacksRepository.GetSubmitted(model.datePass.DateIn, model.datePass.DateOut).ToList(); 
       return View(pv); 
      } 
      else 
      { 
       PackageVals pv = null; 
       return View(pv); 
      } 
     } 
     catch(SystemException ex) 
     { 
      var error = ex.ToString(); 
      this.ModelState.AddModelError(error, ex); 
      PackageVals pv = null; 
      return View(pv); 
     } 
    } 
0

DateTime 값을 Null 가능으로 설정하십시오. 필요할 경우, 필수 속성이 있는지 확인하십시오.

개체를 Null 허용 할 수없는 경우 데이터 모델에서 분리 된보기 모델이 필요합니다. ViewModel을 사용하면 데이터 모델의 필요성에 관계없이 뷰의 필요에 맞게 뷰 모델을 사용자 정의 할 수 있습니다.

+0

나는 nullable 한 샷을주고 알려준다. 댓글 주셔서 감사합니다. – War2d2

+0

DateTime 값을 null로 설정해도 아무 것도 변경되지 않았습니다. 유효한 날짜 형식을 확인하지 않고도 유효하지 않은 문자열이 뷰에서 컨트롤러로 다시 전달되도록 허용합니다. – War2d2

+0

@ War2d2 - 그럼 당신이 잘못하고있는 것이 확실하지 않습니다. 왜냐하면 nullable datetime 필드를 사용하면 날짜 형식에 대한 유효성 검사를 수행 할 것이기 때문입니다. 테스트 응용 프로그램에서 간단한보기로 시도해보십시오. 그러면 내 뜻을 알 수 있습니다. –