MVC. Extending HtmlHelper Versus Custom Class
Feb 16, 2010What are the advantages of extending HtmlHelper instead of creating a Custom Class.
f.e. <%= Html.Table(data) %> vs <%= CustomClass.Table(data) %>
What are the advantages of extending HtmlHelper instead of creating a Custom Class.
f.e. <%= Html.Table(data) %> vs <%= CustomClass.Table(data) %>
When upgrading to mvc2 i noticed some of my javascript that was keying on "Points[0]_Id" (this is invalid for an html id btw) started to fail. I pulled up the source and noticed that the TagBuilder class now generates valid client id's and replaces all invalid characters with the "IdAttributeDotReplacement" (which is a terrible name now, since it's not just a dot replacement character anymore). I started to look for a way to generate client id's using a helper built into mvc and came across HtmlHelper.GenerateIdFromName, but this still generates ids the invalid way!
TagBuilder.GenerateId( "Points[0].Id" ) = "Points_0__Id"
HtmlHelper.GenerateFromName( "Points[0].Id" ) = "Points[0]_Id"
IMO: the tagbuilder class or the GenerateFromName code should not be duplicated in two different spots or else you will get errors like this. Also I consider this change made to TagBuilder.GenerateId to be a breaking change and should be included in the breaking changes section of the release notes.
i am just having a play with HtmlHelpers in MVC, very useful stuff and now i am trying to create one for dropdowns based on passing in a model ( any ) what the property is for the value and same for text.
so i have something like this:
[code]....
thats it
I am beginner in web applications development. I started one little project and host it on source forge "https://homoco.svn.sourceforge.net/svnroot/homoco". And I started implementing authentication in this application to learn how it works. From my experience people never use out of the box things so I want to implement this stuff alone (like in real world projects). So some questions:
1) Is there any reason to use membership out of the box? To use database table schema, stored procedures etc. that tool generate for developer. I think that this lower control over code and I decided to implement it my self. I don't know if I am right.
2) Is my approach in this demo project good or bad (if someone have time I like to do just a little code review)? I created database based on business rules. Not using database schema that membership provider require. Extend "MembershipProvider" class to satisfy my needs. Implement queries to database myself.
3) Now, this question is a little wired but I have to ask it. If we make custom Membership Provider and do sql queries alone, implement all MembershipProvider class methods ourselves, and in application use Membership.blabla() why is this approach different from not extending MembershipProvider class and putting all this methods in some unique class and call its methods then? I hope that someone understand what I ask here.
I am sorry for three questions, but I really trying to find the best way to implement this feature in my demo project like it is a real world application.
When you create a webpage in ASP.net, the codebase inherits System.Web.UI.Page
Now when I extend the page object to check for SessionExpired for example, I create a new class and inherit from system.web.ui.page, and overwrite some functions.
The problem then is that on each page, I have to replace system.web.ui.page with my custompage class.
Is there a way to extend a class by adding methods or modifying its methods directly (e.g. add the sessionExpired check to System.Web.UI.Page) ?
I'm using .NET 2.0
am currently stuck with this problem of displaying an image using HtmlHelper class.Here is what i have.
I have a custom HtmlHelper class which supposed to display an image:
[Code]....
[Code]....
I managed to get to the controller, but image shows as null. Is there a way around it ? or maybe an even better way to do this?
I'm trying to override all the Html.TextBoxFor etc. methods. I want to make them non-static methods in a class that extends ViewUserControl. But, according to intellisense, Html does have access to these methods; they simply don't appear. So basically I want to do something like:
[Code]....
But I'm not getting the syntax right.
Basically just trying to wrap the TextBoxFor call so that my ViewUserControl can drop in a unique id each time.
I saw this implemented somewhere but basically below I'm using the textbox HTMLHelper to draw a textbox with the id myID and default text 'text_goes_here'. I want to also add a class to thiis helper, i saw somewhere it implemented with new {@class =''} as a third parameter creating an object but im not sure exactly how its wrote
<%= Html.TextBox("myID", "text_goes_here") %>
I have an HTML Helper that essentially renders static content read from HTML files (inside of a vdir). There are cases when the HTML file has a title element defined and in such cases, the current page should use the given title. The content inside of the body should be rendered where the Helper class is referenced in the View.
This is how I call the helper.
<%=Html.StaticContent("staticcontent.htm",
new List<StaticContentTag>()
{
new StaticContentTag()
{TagKey=ReplaceTags.MarketName,
TagValue = "Austin"}
}, Model, true) %>
I'm passing in the ViewModel so that I can set the title and the last parameter is a flag that says whether to force the title or not.
The head has the title defined like this.
<title><%=Model.Title%></title>
I know what I'm doing wrong here by referencing the Model.Title element before even calling the helper. Any ideas on how I can work around this?
I can extend the HtmlHelper class from a View page but how can I extend its functionality within a class?
[code]...
I have created a custom html helper as follow:
[Code]....
In my View, I am using it like this:
[Code]....
However, for some reason nothing gets rendered!
I have been able to extend the system class DirectoryEntry by adding static methods like setSAMAccountName, setMail, setPassword, etc.But my goal is to set them like parameters in the form of de.Mail = asp@net.com...Is there a way of doing this without extending the DirectoryEntry class? becose when i run the code de.Childen.Add ... the method implementation returns a DirectoryEntry and not my extended class.
View 1 RepliesI were following the tutorial at this page of how to build my own view engine: [URL] And in hope of just extending the existing RazorViewEngine I made some changes to the code in the tutorial...
[Code]....
The thing is that now when I run my site..I get the following error: CS0246: The type or namespace name 'WebMatrix' could not be found (are you missing a using directive or an assembly reference?) and I just cant find a way to solve this..I have added the references.
When you render one of the "built in" html helpers (say "TextBoxFor") with ":" (so it's encoded) it renders fine.However if I render the following (a custom file input helper) with ":", the markup are displayed.I understand why. Just don't know how to prevent this (no, I want to stay with ":" and not use "=")(I looked at the source code for the built in ones, but can't see what I'm missing: ttp://aspnet.codeplex.com/SourceControl/changeset/view/23011#288010 )
[Code]....
In the new ReSharper 5.0 there is some MVC specific features for highlighting View and Controllers in views when you type them as strings.
So with ReSharper the string below called "ViewName" will get highlighted and clickable for navigation.
Html.RenderPartial("ViewName", model);
My question is if its possible to write custom patterns for custom extension methods. In my case i have a extension method called:
Html.RenderPartialIf(myCondition, "ViewName", model);
But when I do this ReSharper wont find my view. So can it be done?
I'm trying to extend GridView control following these steps:Create a namespace in an empty Visual Basic file: mycontrols.vb
[Code]....
Register it in the WebForm I want it to be
[Code]....
Create the control in my WebForm:
[Code]....
I get an error as tag prefix unknown, and in my code behind file, the control doesn't recognize the primitive GridView properties and methods.
I'm trying to extend de GridView control with a Custom Server Control, I'm doing ok with extended properties but when I get to methods that need to re-apply or modifiy the DataSource I don't get any data in the grid, though the SQLDataSource actually retrieve data. Here is my MyGridView.applyFilter() method, which should filter the data but actually shows an empty GridView, but as I sayed, the DataSource has data. I try to find (FindControl) theSQLDataSource of the GridView (Me) and modifiy its paramters, thenDataBind Me to apply the changes...
[Code]....
What am I doing wrong? why is the gridview empty?
I have a view that is strongly typed and its model is of type LogOnModel. That LogOnModel has anotated properties like this one:
[Required(ErrorMessage = "Please enter your password")]
[DataType(DataType.Password)]
[Display(Name = "Password", Description = "Your secreet password")]
public string Password { get; set; }
All of them has Display anotation with Display.Descripion property set. I want to create HtmlHelper extension method that will output <span> containg the value of Display.Description property. So for example if I called my extension method DescriptionFor than this code:
<%: Html.DescriptionFor(m => m.Password) %>
should produce following html: <span>Your secreet password</span>
I'm trying to extend the GridView into a custom/user control "WorklistGridView". And I'm not quite sure how to do it... so here's what I need:Every row needs to have a control (either a boundfield or a templatefield with a label, etc.) that contains the StepID (which is a column returned in the data set).I want to be able to use the WorklistGridView as a base class and extend it to something like "XyzWorklistGridView", where that child class would have a few more controls in the row template.
View 2 RepliesI've created loads of user controls, but this is my first time dealing with extending a server control. The problem I'm getting is that the base control's data is not being persisted across postbacks in a Master/Content page.I'm actually trying to get this working using a Telerik control (for my sins), but the same issue happens with a standard Web TextBox control. Code:
[Code]....
Now, I've copied the way I handle the control state as I do it with user controls (ControlState), and it isn't working. Can someone point me in the right direction please? All the examples I find refer to creating user controls, not extending existing controls. Specifically why nothing is being persisted on post back.
I an expanding on the HotGridView control (http://msdn.microsoft.com/en-us/magazine/cc163612.aspx). During testing I noticed the "AutoGenerateCheckBoxColumn" behavior was returning true even if the user did not specify the a value in the markup but I expect it to return False if not value is supplied by the user - can anyone shed some light on why the AutoGenerateCheckBoxColumn is always true if not explicitly set to False in the markup?
[Code]....
This is my first "request for help" post - I've spent the past few weeks helping others, so I'm hoping someone can shed some light here.I've dealt with server controls before, so it's not new to me, but it was some time ago and I'm a bit rusty. I have an inherited calendar control, that works fine:
[Code]....
I've overriden the Render method, hoping to be able to modify the HTML output of the control - I want to hide the back arrow if the Month & Year in MinDate is reached in the calendar, and the same goes for MaxDate and the forward arrow.On top of this, I want to be able to display icons in the day cells, under certain data-bound conditions. Once I've figured one out, I'm sure I'll be able to work the other one out.Are there any other methods, events or properties more suitable for this? Are there any other controls that do what I'm looking for that I've maybe overlooked?I'm using C#.Net 4.0 Webforms - it's a very small app, so I've not used MVC etc... just a few LINQ queries to the database.
I'm working on a page that has a significant number of textboxes/dropdowns/etc to fill out. The majority of these are going to be performing some sort of custom validation. I should note that it's nothing of substantial size - all just string or integer values.
I always hear (and have typically always agreed) that as much validation should be performed on the client rather than on the server, but in this case I am unsure. The difference here is that this project will be passed on to an IT guy who knows about computers but is still new to programming - he will be the one in charge of making the minor updates and changes to the way these custom validations work in the future.
My idea shifted from being as efficient as possible to being a bit less efficient but much more readable. I created a new class specifically for all of my validations which will be used throughout the website. By forcing all of my custom validation code in this class, though, I eliminate any client-side validations I might be able to perform. I should also note that each page that requires a custom validation will generally need to perform at least one server-side validation, so I will never be able to use client-side 100%
Considering the relatively low level of activity on the website (currently and in the future), would you consider this as an acceptable solution? Or would you ALWAYS prefer to have as much validation on the client as possible in order to increase the responsiveness, even if it makes things a bit more messy for whoever may be working on it in the future?
I would like to extend the HtmlHelper by using metadata (similar to DataAnnotaions metadata). Specifically I want to be able to add a 'Title' attribute to html controls that will then appear as a tooltip on the control. I would like to keep the tooltip text with my model, for example by adding 'Tiltle' metadata to the model as follows:
[DisplayName("User Id")]
[Title("Enter your 10 digit user id")]
property UserId { get; set; }
So the questions are:
1. How do I add metadata (such as 'Title') to my model?
2. How do I access this metadata in my HtmlHelper extension method?
[code]....
I'd like to inherit all my controllers from a custom base class that I write myself. I can change the line every time I add a new controller, but it would be nicer if I could somewhere specify the default value that gets set there. That way I wouldn't need to worry about forgetting this, and other people who get added to the project later on would have an easier time.
View 3 Replies