how to render partial view and image from same action result method? - c#

I want to return partial view and base64 string from same ActionResult method on load of my View page.
This is my View:Index.cshtml
<body>
<div id="topimage">
#Html.Action("Fetch", "image", new { parameter = 1 }) //Seperate partial view to display top image.
<\div>
<div id="Bottomimage">
<img src=""/>//No partial View to display Bottom image here and how to call my controller method here with passing parameter.
<\div>
</body>
Partial View:_TopImage.cshtml
#model MyMvc.Demo.Model.ImageAttributes
<div>
<img src="data:image;base64,#System.Convert.ToBase64String(Model.Image)" />
</div>
My Controller method which will display both Top and bottom image based on parameter 1 and 0:
public ActionResult Fetch(int parameter)
{
using (var db = new MyDBContext())
{
if(parameter==1)//display top image
var Image = db.ImageAttributes.Where(r => r.DisplayDirection == parameter).FirstOrDefault();
return PartialView("_TopImage", Image );
else
{
var Image = db.ImageAttributes.Where(r => r.DisplayDirection == parameter).FirstOrDefault();
//Now here i just want to return Bytes of image which i will get in my ad Object as
//becasue there is no seperate partial view to display bottom image.so i will
//direclty return bytes from here and convert in to base 64 sstring there to render bottom image
//for eg: <img src="data:image;base64,#System.Convert.ToBase64String(Model.Image)" />
//How to do this
}
}
}
Note:I dont want to create Seperate Controller method and i dont want to change my any view.
So can anybody please Guide me for this???

You can store the action returned HtmlString in a variable if you dont want to call action two times:
#{
var Image = Html.Action("Fetch", "image", new { parameter = 1 });
}
<div id="topimage">
#Image //Seperate partial view to display top image.
<\div>
<div id="Bottomimage">
#image
<\div>
UPDATE:
IN that case modify your action else part like this:
else
{
var Image = db.ImageAttributes.Where(r => r.DisplayDirection == parameter).FirstOrDefault();
var base64Image = Convert.ToBase64String(Image.Image);
var byteArray = Convert.FromBase64String(base64Image);
return File(byteArray , "image/png", "image.png");
}
and in View:
<img src="#Url.Action("Fetch", "image", new { parameter = 0 })" />

If you want to load Your partial view to all it's View Page the simply call Your Partial View From Shared Folder of Your Views

Related

How to pass a TempData to my _Layout.cshtml view

In my _Layout.cshtml I have a navbar that I would like to upload with a picture of the user logged into the system. In other parts of the code I can normally pass the data I want, however, I don't know how to pass a TempData with the photo link to the Layout.
This is the TempData that I use on my controllers and I would like to send it to _Layout.cshtml
var information = _employee.ReturnsDataFunctional (userUser);
TempData["photo"] = information[0]["photo"];
Set your data into a ViewBag variable on the ActionMethord.
public IActionResult Index()
{
var information = _employee.ReturnsDataFunctional (userUser);
var photo = information[0]["photo"];
ViewBag.photo = photo;
....
....
....
return View();
}
Then call it on your _Layout.cshtml
<div class="round avatar" id="profilepic">
<img src="#ViewBag.photo"/>
</div>

Refresh a <div> content on button click in Mvc

This is my controller
public ActionResult Index()
{
return View();
}
public static string GetCuttentTime()
{
return DateTime.Now.ToLongTimeString();
}
}
This is my view
#{
ViewBag.Title = "Index";
}
<div id="div1">
#Temp.Controllers.HomeController.GetCuttentTime()
</div>
<input type="button" value="Refresh" />
I want to refresh the current time on button click. Please Help
You can use jQuery to do this as follows:
$("input" ).click(function() {
$("#div1").load('#Url.Action("GetCuttentTime")');
});
You would need to change your controller action to this:
public ActionResult GetCuttentTime()
{
return Content(DateTime.Now.ToLongTimeString());
}
Also change your div to this:
<div id="div1">
</div>
Removing your controller code.
Screen shot
1) you returns Json: return Json(model, JsonRequestBehavior.AllowGet);
2) you put returned Json object to the div's value: $("#" + area).text(data);
that's why you end up with json's representation inside div
You need to change it as follows:
1) assume you put html for that div to model's field called NewHtml
2) eptract html from the property of returned json: var returnedHtml = data.NewHtml;
3) use html() method instead of text(): $("#" + area).html(returnedHtml);

Call an action method from layout in ASP.NET MVC

I have one layout and one partial view which are in the Shared folder. Partial view presents top menu items which are not static. So I need to call an action method to get menu items from database. To do this, I created a controller and add an action method in it.
When I try to browse the page in web browser, this error occured:
The controller for path '/' was not found or does not implement IController.
Note:
I tried Html.RenderAction, Html.Partial methods too...
And I tried to create another view folder, and create a new partial view and new controller that named with "folder name + Controller" suffix.
Layout:
<!DOCTYPE html>
<html>
<head>
<title>#ViewBag.Title</title>
</head>
<body>
<div id="header">
#Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""}); //Here is the problem.
</div>
<div>
#RenderBody();
</div>
</body>
</html>
_TopMenu.cshtml:
#model IList<string>
#foreach (string item in Model)
{
<span>item</span>
}
LayoutController (in Controllers folder):
public class LayoutController : Controller
{
//
// GET: /Shared/
public ActionResult Index()
{
return View();
}
[ChildActionOnly]
[ActionName("_TopMenu")]
public ActionResult TopMenu()
{
IList<string> menuModel = GetFromDb();
return PartialView("_TopMenu", menuModel);
}
}
What happens if you put this in your view?
#{ Html.RenderAction("TopMenu", "Layout"); }
(And comment this out until everything works: //[ChildActionOnly])
Change this line,
#Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""});
to,
#Html.Action("_TopMenu", "Layout", new {area =""});
and check.
exist differents ways, for this case I like use html.action in layout, and in control I will create a string Menu, the string contains the html code I need, the controller end with return Content(menu);
for example
Layout:
<body>
<nav>
#Html.Action("_TopMenu", "Layout")
</nav>
the controller
public class LayoutController : Controller
{
public ActionResult _TopMenu()
{
IList<string> menuModel = GetFromDb();
string menu = "<ul>";
foreach(string x in menuModel)
{
menu +="<li><a href='"+x+"'>+x+"</a></li>";
}
menu+="</ul>";
return Content(menu);
}
}
I like that because I can use many options to create menus dinamics more complexes.
other way use ajax to recovered the data and use handlebars or other template for the code
You are using the wrong overload of the Action-Method. The 2nd parameter in the variation is not the controllername but the actionname.
You can check the correct Method overloads on this page
Also: If you specify Controllers in the Html.Action Method (which you can do for example with this variation of the Method), you dont need to write the suffix "Controller" even if thats your Classname. So Instead of using the string "LayoutController" you would write simply "Layout".
At this point the framework is convention-based.
This is how I did it:
Layout
#Html.Action("GetAdminMenu", "AdminMenu")
Admin Menu Controller
public PartialViewResult GetAdminMenu()
{
var model = new AdminMenuViewModel();
return PartialView(model);
}
GetAdminMenu.cshtml
#model ReportingPortal.Models.AdminMenuViewModel
<div class="form-group">
<label class="col-md-4 control-label" for="selectbasic">School Name</label>
<div class="col-md-8">
#Html.DropDownListFor(model => model.SelectedID, new SelectList(Model.DataList, "Value", "Text", Model.SelectedID), "", new { #class = "form-control", #required = "*" })
</div>
</div>

Need uploadcontrol in a ajax.beginform using asp.net mvc3 html5 razor

I've been looking for a long time for this but I'm still stuck, I need to have an upload control where the user can upload a document and give additional information.
I've had to do this before without the upload control so what I do is I get an ajax.beginform that will give all the input from the user to the controller and than close the popup trough a onsucces function, so this looks like this:
view:
#using (Ajax.BeginForm("Save", "Documents", new AjaxOptions { HttpMethod = "Post", OnSuccess = "CloseDialog" }, new { #class = "form-inline", id = "FormId" }))
{
#Html.Label("Description", "Description")
<div class="span3">
#Html.TextBoxFor(m => m.Description)
</div>
}
I tried adding there an Html.BeginForm but then I found out that it is not possible to use nested forms so I deleted this.
In my controller I have:
public PartialViewResult Index(string description)
{
var model = new DocumentsModel{ Description = description};
return PartialView(model);
}
[HttpPost]
public ActionResult UploadFile(HttpPostedFileBase file, string description)
{
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath(#"D:\Documentds\"), fileName);
file.SaveAs(path);
}
return RedirectToAction("Index", new { description = description });
}
Ofcourse because the html.beginform won't work this controlleraction won't work either
So my question is how to do this without having to use a html.beginform?
You need to have the file upload inside the form and also the enctype="multipart/form-data" property on the form that calls uploadfile. That could be one problem.
Also, you could use JavaScript to submit the form you want from another part of the page without having them nested and keeping your design.

MVC3 - getting red x instead of picture from db

I am getting red x mark instead of the picture when storing in database. I believe I am having problems in the Views files. Please could someone have a look at this and tell me how to correct it. If I have wrong URL Actions please tell me which ones I should be using. Thanks in advance.
SubCategory2 Table has the following columns...
Column field > Picture1 : Data Type > varbinary(MAX)
Column field > ImageMimeType : Data Type > varchar(50)
Index.cshtml file
#foreach (var item in Model) {
<td>
<img src="#Url.Action("GetImage", "SubProductCategory2",
new { id = item.SubProductCategoryID})" alt="" height="100" width="100" />
</td>
Edit.cshtml file
"Edit" is the method in the contoller. "ProductCategoryL2" is the method in the controller. "GetImage" is the method in controller. All these methods are in the same controller file called ProductCategoryControllerL2
#using (Html.BeginForm("Edit", "ProductCategoryL2", "GetImage",
FormMethod.Post, new { #encType = "multipart/form-data" }))
{
<div class="editor-field">
<img src="#Url.Action("GetImage", "SubProductCategory2", new {
Model.SubProductCategoryID })" alt="" />
#Html.ValidationMessage("Picture1", "*")
<input type="file" id="fileUpload" name="Create" size="23"/>
</div>
}
ProductCategoryL2Controller.cs file
[HttpPost]
public ActionResult Edit(int id, FormCollection collection,
SubProductCategory2 editSubProdCat, HttpPostedFileBase image)
{
var r = db.SubProductCategory2.First(x => x.SubProductCategoryID
== id);
if (TryUpdateModel(r))
{
if (image != null)
{
editSubProdCat.ImageMimeType = image.ContentType;
editSubProdCat.Picture1 = new byte[image.ContentLength];
image.InputStream.Read(editSubProdCat.Picture1, 0,
image.ContentLength);
}
db.SaveChanges();
return RedirectToAction("/");
}
return View(r);
}
public FileContentResult GetImage(int productId)
{
var product = db.SubProductCategory2.First(x =>
x.SubProductCategoryID == productId);
return File(product.Picture1, product.ImageMimeType);
}
Addition Note
I am using MVC 3 framework. The GetImage method has been extacted from Steven Sanderson book Pro ASP.NET MVC 2 Framework. So I am not sure if that will be a problem?
The first step I would take to debug would be to try the URL for the image in your browser directly. Right-click on the red X, copy the url and paste it in your address bar. If the url looks right you should be a better error telling you what the problem is. If that fails, put a breakpoint in your GetImage routine to make sure the routes are correct and your method is getting called. Try Fiddler to see the request being made and what your web server is saying.
My guess is that you have the action wrong. It looks like you are linking to the GetImage action on the SubProductCategory2 controller when the method is on your ProductCategoryL2 controller.
Also I don't understand how your Model.SubProductCategoryID value is supposed to be mapped to your productId parameter. Try changing these calls:
Url.Action("GetImage", "SubProductCategory2",
new { id = item.ProductCategoryID})
Url.Action("GetImage", "SubProductCategory2", new {
Model.SubProductCategoryID })
to these:
Url.Action("GetImage", "ProductCategoryL2",
new { productId = item.ProductCategoryID})
Url.Action("GetImage", "ProductCategoryL2", new {
productId = Model.SubProductCategoryID })
Your input file field is called Create:
<input type="file" id="fileUpload" name="Create" size="23"/>
whereas the controller action parameter handling the form submission is called image (the one with HttpPostedFileBase type) => this parameter will always be null in your Edit controller action and nothing will be saved in the database.
Also the attribute is called enctype and not encType in the Html.BeginForm helper. Also inside the GetImage action ensure that product.Picture1 represents a correct image byte array and that it's content type matches with product.ImageMimeType.
So for example to further debug this issue you could try to save it to some temporary file to see if it is a valid image just before returning. Also make sure that the product instance you have fetched from the database is not null:
// if the content type is image/png:
File.WriteAllBytes(#"c:\foo.png", product.Picture1);
Then ensure that foo.png open successfully with an image viewer.
You are trying to return file content as the value to your img's src attribute. Your browser will need to issue a separate request for the image.
change your view to this:
<img src="GetImage/#(Model.SubProductCategoryID)" />

Categories