views:

46

answers:

1

Hi there I am using xval for the first time, it seems to work fine for required fields, However I am having some issues first of all it does not seem to validate booleans and also client validation is not working for me, this is not a major issue for me, the one that I really need to work is the stringlength property. It seems to do something because the form is not posted when the string length is exceeded, however no error message is displayed to the user which is obviously not what I want, has anyone been able to do this successfully?

My model goes like this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace PitchPortal.Core
{
    public class DocumentMetadata
    {

        //[Required]
        // public bool visibility { get; set; }


        [Required,StringLength(10, ErrorMessage = "title is too long")]
        public string title { get; set; }

        [Required, StringLength(10, ErrorMessage = "description is too long")]    
        public string description { get; set; }

        [Required, StringLength(10, ErrorMessage = "summary is too long")]    
        public string summary { get; set; }

    }
}

the html goes like this

<div id="results" title="Upload results"/> 
  <form id="myForm"  action="<%=Url.Action("New") %>"  method="post" enctype="multipart/form-data">  
    <% Html.EnableClientValidation(); %>

    <%= Html.ValidationSummary() %>
    <table>
         <tr>
               <td> <%=Html.Label("File")%></td>
               <td>
                    <input type="file" id="file1" name="fileUpload" /> <br />
                    <%=Html.SubmitButton<DocumentController>(x => x.Upload(), "GetImage", "")%>
               </td>
               <td>
                    <%=Html.ValidationMessage("file1")%>
               </td>
         </tr>   
         <tr>
                <td> <%=Html.Label("Visible")%></td>
                <td>
                     <%= Html.RadioButton( "visibility",true,true)  %>true
                     <%= Html.RadioButton("visibility", false)%>false
                </td>
                <td>
                     <%= Html.ValidationMessage("visibility")%>   
                </td>

         </tr> 
         <tr>   
                <td> <%=Html.Label("Title")%></td>
                <td> <%=Html.TextBox("doc.title")%></td>         
                <td> <%= Html.ValidationMessage("doc.title")%></td>
         </tr>
         <tr>   
                <td> <%=Html.Label("Description")%></td>
                <td><%= Html.TextArea("doc.description")%></td> 
                <td><%= Html.ValidationMessage("doc.description")%></td>
         </tr>
         <tr>
                <td> <%=Html.Label("Summary")%></td>
                <td> <%= Html.TextArea("doc.summary")%></td>  
                <td> <%= Html.ValidationMessage("doc.summary")%></td>
         </tr>
         <tr>  
                <td> <%=Html.Label("Filetype")%></td>
                <td> <%= Html.DropDownList("Filetype_id", (IEnumerable<SelectListItem>)ViewData.Model.AllFiletypesList)%> </td>

                <td> <%= Html.ValidationMessage("doc.Filetype_id")%> </td>
         </tr>
         <tr>
                <td> <%=Html.Label("Category")%></td>
                <td><%= Html.DropDownList("cat.parent_id", (IEnumerable<SelectListItem>)ViewData.Model.AllCategoriesList, "-please select item-", new { className = "unselected" })%> </td>
           <td><%= Html.ValidationMessage("cat.parent_id")%> </td>
         </tr>

      <% 
          if (Session["TempFolder"] == null)     
          {
                 for (int i = 1; i < 6; i++) 
                 { %>
                     <tr>
                         <td> <%=Html.Label("Shot "+i.ToString()) %> </td>
                         <td><input type="file" id="image_<%= i.ToString() %>" name="image_<%= i.ToString() %>" /></td>
                     </tr>
        <%       } 
          }%>

        <tr>
              <td><input type="submit"  value="save"/></td>
        </tr>
</table>
</form>    
</div>

The code for the partial class is here

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Web;
using System.IO;
using System.Configuration;
using xVal.ServerSide;
using System.Web.Mvc;
using PitchPortal.Core.Repositories;
using System.Web.Script.Serialization;
using System.ComponentModel.DataAnnotations;
using PitchPortal.Core.Extensions;
namespace PitchPortal.Core
{
    [MetadataType(typeof(DocumentMetadata))]

    public partial class Document : IPostedFile
    {

        IRepository<FileType> IFiletypeRepository = new Repository<FileType>(new DataContextProvider(new ConnectionStringProvider(ConfigurationManager.AppSettings["ConnectionString"])));
       static ILoggingService logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<ILoggingService>();


       public  int DownloadCounter
       {
           get
           {
               return this.Downloads1.Count;
           }
       }

        [ScriptIgnore]
        public bool IsNewDocument
        {
            get { return this.document_id<1; }
        }


        public string clientClassPath
        {
            get { return "DocumentVO"; }
        }

        public string VersionGuid
        {
            get;
            set;
        }

        [ScriptIgnore]
        public virtual HttpPostedFileBase PostedFile
        {
            get;
            set;
        }
        [ScriptIgnore]
        public string BasePath
        {


            get
            {


                 return PathExtensions.Build(new string[] { ConfigurationManager.AppSettings["Root"], Category1.GetFamilyTreePath(), title });


            }


        } 




    }


}
A: 

You forgot to put:

<%= Html.ClientSideValidation("doc", typeof(Document))
        .UseValidationSummary("validationSummary") %>

and to put your <%= Html.ValidationSummary() %> bettween tags <div id="validationsummary">and </div>

Gregoire
Thanks Gregoire, that worked for the client side validation (Thanks a lot, you dont know how much it means to me) but does not quite sort of the stringlength issue, I understand it was not meant to. Do you know of any fixes for that?
mctayl
Can you post your document class code?
Gregoire
I am using Linq and a buddy/metadata class, This is the class that I posted earlier. Thanks
mctayl
I have also posted the partial class extending the linq generated class
mctayl
I don't unsderstand well for your stringlength issue, your problem is in the client or in the server side? If it is in the server side you need to have function that verifies your object checks the DataValidationRunner on this page: http://blog.stevensanderson.com/category/xval/page/2/
Gregoire
Thanks for your reply, It must be my mistake, I thought StringLength and Range works out of the box, didnt know that you need to write code in the model class to do this. Am i correct in assuming this? Ideally I want it to work for both client and server side, bit server side is more important
mctayl
I will check out the line, hopefully it will shed some light. Thanks a lot by the way
mctayl
You are correct, you must apply the validation yourself in the server side. In MVC version 2.0 you can use Model.IsValid in your controller
Gregoire