MVC :: Instead Of Null, The Model Inserts A 0 Into The Database?
Aug 3, 2010
I have a group of radiobuttons. The field they are 'bound' to is of datatype tinyint (sql server), byte .NET. It is set to NOT accept nulls in the database column (col1) and no default value has been set for the column, or indeed, anywhere else.
If the user doesn't select any of them, I would expect null to be that the model would attempt to insert into the database. I would therefore get a validation error that I can display to the user, prompting them to choose one of the options.
However, instead of null, the model inserts a 0 into the database. As this does not fail, no error is raised.
I am not setting the default value to 0 anywhere, not in the mvc app or the database
I have been struggling for a while 72 hours with this .When I update the form view a NULL value is inserted in my product ID field instead of the productID from the drop down list.
Why does a very simple script which inserts 26,000 records into a mysql database (myisam, no transactions) take 13 seconds in the php implementation, and then 35-50 seconds using mono+mysql connector? I thought asp.net was faster than php? Could the problem be the mono mysql connector is "platform independent", so the performance just stinks? or does asp.net suffer more overhead than php when it comes to executing each query? Aren't there any native linux binaries for mysql connector for mono that may be faster?
My controller calls a class in my model which is getting data from a REST web service. The class in the model then passes the data back to the controller using an IList, like so:
[Code]....
My problem is this: The data that is held in the IList isn't there until the user has done a search in the View, submiting a form. This is a basic search function with 2 textboxes and a submit button in a form. When the user clicks submit, the controller action is called, the web service is then called, and the data in the IList gets populated. The problem is that in the View I am using a strongly typed view and my model reference in the foreach loop throws a Null Reference Exception because there is no data in it, because a search has not been conducted yet... [Code]....
So, how can I have the above foreach loop in my view if there isn't any data in the model until a search has been conducted? Is there a better way that I should be doing this?
Essentially, what's the best method for passing data back to a view that is based on a form submittion?
I have several models that implement a array property using null object pattern in the following manner:
[Code]....
The problem is that any time I attempt to bind to a property of this type the DefaultModelBinder.CollectionHelpers.ReplaceCollectionImpl method wants to call ICollection<T>.Clear() and then ICollection<T>.Add() on the zero length array.
The real issue seems to be in DefaultModelBinder.BindComplexModel() method however. The method contains an explicit check for arrays and special handling to account for the fact that they don't support clear/add functionality. The problem is that the check stipulates that the array model must also be null. If it is non-null, normal ICollection<T> handling ensues which presumes support for clear and add. Can any one explain why the null check is there? It seems to me that either 1) the null check should be removed to permit replacement based binding to non-null arrays or 2) an explicit error stating that non-null arrays are not supported should be thrown.
I vote for the former. I can understand that in general, replacing an existing model with a refrence to a different model would be considered a bad thing. The calling code would not expect this in general and it could lead to hard to find bugs. However, in the case of arrays, if the calling code expects the array property to be modified at all, then I think the normal expectation would be that such modification would occur via replacement of the array.
I have setup my business object to have a create_date and edit_date members both datetime datatypes. My company want to display the create_date and edit_date fields in a gridview for each transaction. The problem i have is that after insterting a record it will have a valid create_date but no edit_date and when displayed in the gridview it defaults to datetime.minvalue (My default). How on earth do i show an empty field in my gridview for a null datetime field in the database?
I am using similar architecture to the Imar Spaanjaars example of a tiered solution. With a few small tweeks it has worked well for me for ages. I am passing a List<Database> to my object datasource which connects to my gridview.
So i'm working on the form that i started MVC with - the problem is that i'm NOT using a ViewModel for the view, its an actual Linq to SQL object. And so far it works fine. This form is a beast and id rather not refactor it to use viewmodels....
My big problem now is that depending some condition, i pretty much set almost everything to disabled when a particular dropdown is selcted (to mimic a deactivated state) - when the user hits submit, the model fields are now null, even tho you can see them filled in (just greyed out and unselectable) and validation refuses them.
Is there anyway around this other than to refactor the Views to use ViewModels (and set different validation rules so submit works)?
I have a form which uploads a photo to my database, and I use a view model to aid in this process.
View Model:
public class GalleryViewModel { //Members: public Gallery _photo { get; set; } public string _title { get; set; }[code]...
When I debug the code, I see that the in the post method in my controller, all the information from the form is updated in the view model except for the uploadFile which is null.In the form I use enctype = "multipart/form-data". When I use my master page the uploadFile is null but when I use the default MVC master page everything works fine.
This is pretty much the same error I got when trying to use the entity object directly as model, rather than having AutoMapper create a ViewModel. So what am I doing wrong? This is driving me crazy...
UPDATE 3:Well, neverending story... I found some info on using UseDestinationValue on the CreateMap method in AutoMapper. So I tried that, and well, that actually got me a bit further. But...now I get a new exception on SaveChanges() (in the EF model). The exception now is: "The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable." This appears to be an exception that also occurs when trying to delete child objects in a one-to-many relationship if you don't have cascade delete set, but that's not what I'm trying to do here...
Here's the updated CreateMap methods:Mapper.CreateMap<ConsultantViewModel, Consultant>().ForMember("Id", opts => opts.Ignore()).ForMember( x => x.Programs, opts => opts.UseDestinationValue()); Mapper.CreateMap<Consultant, ConsultantViewModel>();
I'm using MVC 2 with some Models from a LinqToSql project that I built. I see that when I post back to a Controller Action after editing a form that has a DateTime field from the Model, the MVC Html.ValidationMessageFor() helper will nicely display an error beside the Date text box. This seems to happen automatically when the you test ModelState.IsValid() in the Controller Action, as if the MVC model binding automatically knows that the DateTime field cannot be empty.
My question is... I have some other string fields in these LinqToSql generated classes that are Not-Nullable (marked as Not Nullable in Sql Server which passes thourgh to the LinqToSql generated classes), so why doesn't Mr. MVC pick up on those as well and display a "Required" message in the ValidationMessageFor() placeholders I have added for those fields?
Sure, I have successfully added the MetadataType(typeof<t>) buddy classes to cover these Non-nullable string fields, but it sure does seem redundant to add all this metadata in buddy classes when the LinqToSql generated classes already contain enough info that MVC could sniff out. It MVC validation works with DateTime automatically, why not these Not-nullable fields too?
Normally I work in ASP Classic, and am still a bit green on ASP.Net MVC.
I have my model with its fields or entities (might not be the right word hence why not able to find if previously answered, forgive me), and some of these will have null values such as hyperlinks, email address, specific types of phone numbers, etc.
What I want to do is not write certain blocks of HTML within the foreach loop if a field is empty.
In ASP Classic, I would have written an If statement along the lines of:
<% If RS.field <> NULL then %>HTML with <%=RS.field %><% End If %> <% If RS.field2 <> NULL then %>HTML with <%=RS.field2 %><% End If %> ...
However, I don't know how to achieve the same result in ASP.Net MVC.In one of my current usages, a list of sellers returned for a specific set of search results, it runs through a foreach loop and returns the current HTML (in part):
Website: <a class="url" href="<%= seller.ContactWebsite %>" target="_blank" title="Visit the website for <%= seller.Name %>"><%= seller.ContactWebsite %></a><br />
So, if for example I have a field from the model, say seller.ContactWebsite, and this field was NULL, I would not want it to write this as part of the foreach loop.
public class WebModel { public List<ArticleModel> Articles { get; set; } } public class ArticleModel { public int ID { get; set; } public double ValueParam { get; set; } }
Then I have the controller with the two actions:
[Authorize] public ActionResult Index() { WebModel model = new WebModel(); ModelConverter.ConvertToModel(model, controller); return View(model); } [Authorize] [HttpPost] [ValidateInput(false)] public ActionResult Index(WebModel model, string saveButton) { ModelValidation.ValidateWebModel(model, ModelState); if (ModelState.IsValid) { return RedirectToAction("Create", "Article"); } ModelConverter.ConvertToModel(model, controller); return View(model); }
If I press the submit button, I get to the second action method in the controller (the one with the HttpPost attribute). In this action, the object model itself is not null, but the "Articles" list inside is null.
This is a simplified example of what I need. Imagine a person table with several different club tables. Every person can belong to any number of clubs, but must belong to at least one club. The association would be a 1 to zero or one between the person table and each of the club tables.I've created the databases, then the entity model. The associations are all 1 to many, which isn't what I want.
Is there a way to modify the database so that the model is created correctly? I'm still building the project, making lots of changes, and I've had problems with updating the model, so I keep recreating it. Setting up the database correctly would be preferable.I'm trying to follow the quickstart here: [URL]but I'm using the SQL Management Studio designer, and I can't find how to fix the associations I add.
I've been reading about using or not using foreign keys in the model, but it's only confused me more. Can someone help me understand this? I'm starting to write code with what I have, and I'm running into problems. I'm about to start using joins, which means I'm trying to use a hammer instead of a saw because I don't know how to use my saw. I'd rather understand my tools and use them the right way!
Im just wondering how you go about creating dynamic properties on entities that generated from a database generated model.For example I have a UserInformation table. In that table it has basic information on the user (well derr) like user name, address details etc etc. I want to add a readonly property that concatenates the user's Name, Address details and Phone Number into one string that I can output to a view. Any ideas on how i would go about creating this dynamic property. This is just a simple example, i am wanting to do some more complex calculating and concatenating.
I have an application that uses multiple identical databases. When the user logs in they select the database that will be working with for that session. I am EF 4.0 for to access the database. What I can't figure out is how to dymaically pass the database name of the database from a session variable to the code in the EDMX file.
I am trying to get the FailedPasswordAttemptCount from the ASP.NET built in objects and I am not able to find one, is there any way I can get this value without creating a new storedProc?
I have a formview and I opened it in Insert mode where the fields were all blank as I expected. I then entered some data into the fields but instead of clicking insert I clicked cancel. I then entered the formView in Insert mode again and the previous data was still present.
how to set it up so it will be cleared if cancel was pressed?
First: Using the wizards in Web Developer 2008, is it possible to create multiple inserts into various tables? Just looking for a Yes/No answer.What is the easiest, and best way to create a SQL query to search multiple tables, using a dropdown list as the criteria? Using 3 tables as an example: How would this look? Anyone know of some examples out there with regards to querying or updating multiple tables?