开发者

MVC3 Dynamic DataAnnotation attribute StringLength

UPDATE #3: Entire question

I have a class HB:

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

    [StringLength(3000)]
    public string Text { get; set; }
    public Title Title { get; set; }

}

And Title:

    public class Title
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Max开发者_运维知识库Char { get; set; }   
}

Before you can write a HB (which is kind of an article), you have to choose your title, so your StringLength for HB.Text can be determined. Meaning, this article can only have a certain amount of chars, deppending on what 'Title' the writer has. Example: Title1 can only write a 'HB' with 1000 chars, and Title2 can write a 'HB' with 3000 chars. So. Thats means the the StringLength has to come from Title.MaxChar. Whats the smartest way to do that?

The Title entity is prefixed data that will be stored in the db.

To be crystal clear, what I want to achieve is something in the line with: [StringLength(Title.MaxChar)]

Ive done structure/design for this mechanism in Webforms a million times, my brain just cant addapt to mvc, so some help would be appreciated. Code would be even more appreciated.


Pretty sure that is not possible as written. This strikes me as trying to force business logic into the model that belongs in the controller.

In this situation, I would make the attribute on the Text property [StringLength(3000)]. In the controller, during validation, I would write something along these lines:

public ActionResult (HB model)
{
    if (model.Text.Length > model.Title.MaxChar){
        ModelState.AddModelError("Text", string.Format("Text for this Title cannot exceed {0} characters.", model.Title.MaxChar));
    }

    if (ModelState.IsValid) 
    {
        //do stuff
        return RedirectToAction("Index"); //or something
    } 
    else 
    {
        return View(model);
    }
}

I believe this will accomplish what you are trying to do. Now, for the Title object, I'd flatten that out a bit in your model:

public class HB
{
    #region Base Properties

    public int Id { get; set; }

    [StringLength(3000)]
    public string Text { get; set; }

    #endregion

    #region Title Properties

    public int TitleId { get; set; }
    public string TitleName { get; set; }
    public int TitleMaxChar { get; set; }

    #endregion
}

This is assuming you need to display that information in your view. If you just need to reference it for your business logic validation, just have the TitleId property and use that to instantiate the Title object in your controller when you need it. Don't forget to make hidden inputs for each of these properties if they are not editable!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜