My controller get null value when i get list by id - sql-server

why my controller gets the null value for Address, Phone, UserName, Email?
When i debug, Payment2 POST has received id from view and has a value.
My controller:
[HttpGet]
public ActionResult Payment2(int id)
{
model md = new model();
var pm = new paymentmodel();
var cart = Session[CartSession];
if (cart != null)
{
md.v1 = (List<CartItemModel>)cart;
}
md.v2 = pm.userdetails(id);
return View(md);
}
[HttpPost]
public ActionResult Payment2(int id, User c)
{
var cart = (List<CartItemModel>)Session[CartSession];
foreach (var item in cart)
{
if (item.quantity > item.Product.suspended)
{
return Redirect("/loi-so-luong");
}
}
var oder = new HoaDon();
oder.Date = DateTime.Now;
oder.Address = c.Address;
oder.Phone = c.Phone;
oder.TenNguoiNhan = c.UserName;
oder.E_mail = c.Email;
}
return Redirect("/hoan-thanh");
}
NULL with Address, Phone, UserName, Email
My model.cs:
public class model
{
public List<CartItemModel> v1 { set; get; }
public List<get_customer_Result> v2 { set; get; }
}
My paymentmodel:
public class paymentmodel
{
KINHDOANHVLXDEntities ke = new KINHDOANHVLXDEntities();
public List<get_customer_Result> userdetails(int id)
{
var ln = ke.get_customer(id);
return ln.ToList();
}
}
My index view:
#model List<thuctaplan2.Models.CartItemModel>
#using thuctaplan2.Common
#{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
var session = (UserLogin)Session[CommonConstants.USER_SESSION];
}
Thanh Toán
My Payment2 View:
#model thuctaplan2.Models.model
#{
ViewBag.Title = "Thanh Toán";
Layout = "~/Views/Shared/_Layout.cshtml";
}
#using (Html.BeginForm("Payment2", "Cart", FormMethod.Post))
{
foreach (var item in Model.v2)
{
<div class="form-group">
<label>Name</label>
<label>#item.UserName</label>
</div>
<div class="form-group">
<label>Phone</label>
<label>#item.Phone</label>
</div>
<div class="form-group">
<label>Address</label>
<label>#item.Address</label>
</div>
<div class="form-group">
<label>E-mail</label>
<label>#item.Email</label>
</div>
}
<button type="submit" class="btn">Send</button>
}

What is happening here based on your code is that when you render your view, all your controls inside your Form is empty or with no value, in short, null. Why? Because you only render label html elements inside your Form.
In order to have a value, add a textbox like this:
#Html.TextBoxFor(modelItem => item.UserName, new { #class = "form-control" })
So that when you submit your Form, your User model properties like UserName will have a value. If this are all labels only, no value will be passed to your controller.

Related

Save ASP.NET core Identity User attributes in another table

I am developing an ASP .NET core web application. I employ Identity UI framework for the user registration and authorization in the application. I inherit Identity User to my ApplicationUser class as follows. It creates a table called as ApplicationUser and save the relevant data under the given attributes successfully: (I am using Microsoft SQL database)
ApplicationUser.cs
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
#nullable disable
namespace WebApp.Models
{
public partial class ApplicationUser : IdentityUser<int>
{
public ApplicationUser()
{
}
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastNam { get; set; }
public DateTime? DateOfBirth { get; set; }
public string Bio { get; set; }
public virtual UserAddress UserAddress { get; set; }
}
}
Then I implemented UserAddress model class as follows. It creates another table in the database named as "UserAddress"\
UserAddress.cs
using System;
using System.Collections.Generic;
#nullable disable
namespace WebApp.Models
{
public partial class UserAddress
{
public int UserId { get; set; }
public string BuildingNo { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
public virtual ApplicationUser User { get; set; }
}
}
Next in under Areas folder in Identity UI frame work, I change the Index.cshtml file as follows. i inserting new entry to enter the building number of the user, that should be saved in UserAddress table in database.
Index.cshtml
#page
#model IndexModel
#{
ViewData["Title"] = "Profile";
ViewData["ActivePage"] = ManageNavPages.Index;
}
<h4>#ViewData["Title"]</h4>
<partial name="_StatusMessage" model="Model.StatusMessage" />
<div class="row">
<div class="col-md-12">
<form id="profile-form" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="=row d-flex flex-row">
<div class="form-group col-md-6">
<label asp-for="Input.UserName"></label>
<input asp-for="Input.UserName" class="form-control" />
</div>
</div>
<div class="=row d-flex flex-row">
<div class="form-group col-md-6">
<label asp-for="Input.FirstName"></label>
<input asp-for="Input.FirstName" class="form-control" />
</div>
<div class="form-group col-md-6">
<label asp-for="Input.MiddleName"></label>
<input asp-for="Input.MiddleName" class="form-control" />
</div>
</div>
<div class="=row d-flex flex-row">
<div class="form-group col-md-6">
<label asp-for="Input.LastNam"></label>
<input asp-for="Input.LastNam" class="form-control" />
</div>
</div>
<div class="=row d-flex flex-row">
<div class="form-group col-md-6">
<label asp-for="Input.DateOfBirth"></label>
<input asp-for="Input.DateOfBirth" class="form-control" />
</div>
<div class="form-group col-md-6">
<label asp-for="Input.PhoneNumber"></label>
<input asp-for="Input.PhoneNumber" class="form-control" />
<span asp-validation-for="Input.PhoneNumber" class="text-danger"></span>
</div>
</div>
<div class="=row d-flex flex-row">
<div class="form-group col-md-6">
<label asp-for="Input.BuildingNo"></label>
<input asp-for="Input.BuildingNo" class="form-control" />
</div>
</div>
<div class="=row d-flex flex-row">
<div class="do-md-6">
<button id="update-profile-button" type="submit" class="btn btn-primary">Save</button>
</div>
</div>
</form>
</div>
</div>
#section Scripts {
<partial name="_ValidationScriptsPartial" />
}
And in the Index.cshtml.cs file, I tried to save the building number in the UserAddress table as follows but it fails to enter the data into the table.
Index.cshtml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using WebApp.Models;
namespace WebApp.Areas.Identity.Pages.Account.Manage
{
public partial class IndexModel : PageModel
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
public IndexModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public string BuildingNo { get; set; }
public string Username { get; set; }
[TempData]
public string StatusMessage { get; set; }
[BindProperty]
public InputModel Input { get; set; }
public class InputModel
{
[DataType(DataType.Text)]
[Display(Name = "User Name")]
public string UserName { get; set; }
[DataType(DataType.Text)]
[Display(Name = "First name")]
public string FirstName { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Middle name")]
public string MiddleName { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Last name")]
public string LastNam { get; set; }
[Display(Name = "Date of Birth")]
[DataType(DataType.Date)]
public DateTime DateOfBirth { get; set; }
[Phone]
[Display(Name = "Phone number")]
public string PhoneNumber { get; set; }
[Display(Name = "Building No:")]
[DataType(DataType.Text)]
public string BuildingNo { get; set; }
}
private async Task LoadAsync(ApplicationUser user)
{
var userName = await _userManager.GetUserNameAsync(user);
var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
Username = userName;
Input = new InputModel
{
UserName = user.UserName,
FirstName = user.FirstName,
MiddleName = user.MiddleName,
LastNam = user.LastNam,
PhoneNumber = phoneNumber,
};
}
public async Task<IActionResult> OnGetAsync()
{
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
await LoadAsync(user);
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
if (!ModelState.IsValid)
{
await LoadAsync(user);
return Page();
}
var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
if (Input.PhoneNumber != phoneNumber)
{
var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
if (!setPhoneResult.Succeeded)
{
StatusMessage = "Unexpected error when trying to set phone number.";
return RedirectToPage();
}
}
if(Input.FirstName != user.FirstName)
{
user.FirstName = Input.FirstName;
}
if (Input.MiddleName != user.MiddleName)
{
user.MiddleName = Input.MiddleName;
}
if (Input.LastNam != user.LastNam)
{
user.LastNam = Input.LastNam;
}
if (Input.DateOfBirth != user.DateOfBirth)
{
user.DateOfBirth = Input.DateOfBirth;
}
if (Input.UserName != user.UserName)
{
user.UserName = Input.UserName;
}
user.UserAddress.BuildingNo = Input.BuildingNo; // I tried to enter the building address to the UserAddress table by using this code
await _userManager.UpdateAsync(user);
await _signInManager.RefreshSignInAsync(user);
StatusMessage = "Your profile has been updated";
return RedirectToPage();
}
}
}
Please ignore the above lengthy Index.cshtml.cs code I have provided, I have commented near the only code that I used to insert the input building number to the UserAddress table. which is:
user.UserAddress.BuildingNo = Input.BuildingNo;
This is the part of view of the entry: The entry view
And this is the error I am getting when above code is run: The error message
For the record: all the fields in ApplicationUser table is updated. but this error occurs when I am trying to insert data into UserAddress table.
I am pretty user this is a very simple question for a person who knows ASP.NET core identity user very well.
I kindly request if somebody can please help me to save the input building number in another table named User Address?
Thanks in advance !!!
You can change your code like below:
First use code get current user include UserAddress:
var user = await _userManager.Users
.Include(x => x.UserAddress)
.SingleAsync(x => x.UserName== Input.UserName);
Then determine whether UserAddress exists and update it.
if (user.UserAddress == null)
{
user.UserAddress = new Models.UserAddress
{
BuildingNo = Input.BuildingNo
};
}
else
{
user.UserAddress.BuildingNo = Input.BuildingNo;
}
The whole code is like below:
public async Task<IActionResult> OnPostAsync()
{
//get the current user
var user = await _userManager.Users
.Include(x => x.UserAddress)
.SingleAsync(x => x.UserName== Input.UserName);
if (user == null)
{
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
if (!ModelState.IsValid)
{
await LoadAsync(user);
return Page();
}
var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
if (Input.PhoneNumber != phoneNumber)
{
var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
if (!setPhoneResult.Succeeded)
{
StatusMessage = "Unexpected error when trying to set phone number.";
return RedirectToPage();
}
}
if(Input.FirstName != user.FirstName)
{
user.FirstName = Input.FirstName;
}
if (Input.MiddleName != user.MiddleName)
{
user.MiddleName = Input.MiddleName;
}
if (Input.LastNam != user.LastNam)
{
user.LastNam = Input.LastNam;
}
if (Input.DateOfBirth != user.DateOfBirth)
{
user.DateOfBirth = Input.DateOfBirth;
}
if (Input.UserName != user.UserName)
{
user.UserName = Input.UserName;
}
//insert the BuildingNo
if (user.UserAddress == null)
{
user.UserAddress = new Models.UserAddress
{
BuildingNo = Input.BuildingNo
};
}
else
{
user.UserAddress.BuildingNo = Input.BuildingNo;
}
await _userManager.UpdateAsync(user);
await _signInManager.RefreshSignInAsync(user);
StatusMessage = "Your profile has been updated";
return RedirectToPage();
}

"There is no ViewData item of type 'IEnumerable' that has the key" Problem

I need to set "ManagerID" as the "id" from "Employee".(I mean ManagerID and id are linked). I write codes but have a problem. It shows items with dropdownlist correctly but when I try to apply, it says "There is no ViewData item of type 'IEnumerable' that has the key ManagerID"
View
<div class="form-group">
#Html.LabelFor(model => model.ManagerID, "ManagerID", htmlAttributes: new { #class = "control-label col-md-2" })
<div class="col-md-10">
#Html.DropDownListFor(model => model.ManagerID, (List<SelectListItem>)ViewBag.Manager , htmlAttributes: new { #class = "control-label col-md-2" })
#Html.ValidationMessageFor(model => model.ManagerID, "", new { #class = "text-danger" })
</div>
</div>
Controller
public ActionResult Add_Department()
{
List<SelectListItem> employeeList = (from a in db.Employee.ToList()
select new SelectListItem
{
Text = a.Name + a.Surname,
Value = a.id.ToString()
}).ToList();
ViewBag.Manager = employeeList;
return View();
}
[HttpPost]
public ActionResult Add_Department(Department_Info department)
{
if (ModelState.IsValid)
{
db.Department_Info.Add(department);
db.SaveChanges();
return RedirectToAction("Main");
}
return View(department);
}
Model:
public partial class Department_Info
{
public int id { get; set; }
public string Department { get; set; }
public Nullable<int> ManID { get; set; }
}
The problem is you are not saving your Manager dropdown to ViewBag in your post action because if your request is not validated successfully then you will be returned the same page but at this time you ViewBag.Manager is null so it will cause an error.
So you need to add ViewBag.Manager SelectList also in the post action method.
[HttpPost]
public ActionResult Add_Department(Department_Info department)
{
if (ModelState.IsValid)
{
db.Department_Info.Add(department);
db.SaveChanges();
return RedirectToAction("Main");
}
List<SelectListItem> employeeList = (from a in db.Employee.ToList()
select new SelectListItem
{
Text = a.Name + a.Surname,
Value = a.id.ToString()
}).ToList();
ViewBag.Manager = employeeList;
return View(department);
}
I've also noticed that your Manager dropdown name is ManagerID while your Department_Info model doesn't have the field with the same name. Actually, this is the problem which produces the worst condition and your first problem encounters.
You need to update your Department_Info model:
public partial class Department_Info
{
public int id { get; set; }
public string Department { get; set; }
public Nullable<int> ManagerID { get; set; }
}
Or you need to change your dropdown name:
#Html.DropDownList("ManagerID", (List<SelectListItem>)ViewBag.Manager, htmlAttributes: new { #class = "control-label col-md-2" })
Hopefully, It will resolved your problem.

Http post in angularjs sends empty object

I'm learning AngularJS and I've been trying to send data from a controller using $http.post to a web api, but I keep getting empty data.
Any idea why? Tks in advance
This is my angular code
<!doctype html>
<html>
<head>
<title>Product Add</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
</head>
<body ng-app="ProductAdd">
<script>
var app = angular.module('ProductAdd', []);
app.controller('ProductAddController', ['$scope', '$http', function ($scope, $http) {
$scope.submit = function () {
if ($scope.Name) {
var product = {
"Name": $scope.Name,
"Category": $scope.Category,
"Price": $scope.Price
}
$http.post('http://localhost:1110/api/product', JSON.stringify(product)).
success(function () {
alert('Product Added Successfully');
}).
error(function () {
alert("erro");
});
}
};
}]);
</script>
<h2>Add New Product</h2>
<form ng-submit="submit()" ng-controller="ProductAddController">
<div>Name:<input type="text" ng-model="Name" required></div><br />
<div>Category:<input type="text" ng-model="Category" required> </div> <br />
<div>Price:<input type="text" ng-model="Price"> </div> <br />
<div> <input type="submit" id="productsubmit" value="Submit" /></div> <br />
</form>
</body>
</html>
This is my Web Api controller code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;
using Product_API.Models;
namespace Product_API.Controllers
{
[EnableCors("http://localhost:3442", "*","*")]
public class ProductController : ApiController
{
public static Lazy<List<Product>> Products = new Lazy<List<Product>>();//Static variable use only for demo, don’t use unless until require in project.
public static int PgaeLoadFlag = 1; // Page load count.
public static int ProductId = 4;
public ProductController()
{
if (PgaeLoadFlag == 1) //use this only for first time page load
{
//Three product added to display the data
Products.Value.Add(new Product { ID = 1, Name = "bus", Category = "Toy", Price = 200 });
Products.Value.Add(new Product { ID = 2, Name = "Car", Category = "Toy", Price = 300 });
Products.Value.Add(new Product { ID = 3, Name = "robot", Category = "Toy", Price = 3000 });
PgaeLoadFlag++;
}
}
// GET api/product
public List<Product> GetAllProducts() //get method
{
//Instedd of static variable you can use database resource to get the data and return to API
return Products.Value; //return all the product list data
}
// GET api/product/5
public IHttpActionResult GetProduct(int id)
{
Product product = Products.Value.FirstOrDefault(p => p.ID == id);
return product == null ? (IHttpActionResult) NotFound() : Ok(product);
}
**// POST api/product
[AcceptVerbs("OPTIONS")]
public void ProductAdd(Product product) //post method
{
product.ID = ProductId;
Products.Value.Add(product);
ProductId++;
}**
}
}
and this is my model
namespace Product_API.Models
{
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public int Price { get; set; }
}
}
Just don't stringify your object:
$http.post('http://localhost:1110/api/product', product)

How to Upload 2 Image Files into MVC C# 5 database in its respective Byte[] array property?

public class Opportunity
{
[Key]
public int OpportunityId { get; set; }
[Required(ErrorMessage = "Graphics Image is required")]
public byte[] Graphics { get; set; }
[DisplayName("Faculty Picture")]
[Required(ErrorMessage = "Faculty Image is required")]
public byte[] FacultyPicture { get; set; }
}
Controller:
namespace Kaust.Views.Opportunities
{
public class OpportunitiesController : Controller
{
private KaustContext db = new KaustContext();
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "OpportunityId,Graphics,FacultyPicturen")] Opportunity opportunity)
{
if (ModelState.IsValid)
{
db.Opportunities.Add(opportunity);
db.SaveChanges();
return RedirectToAction("Index");
}
}
View:
Create index:
#using (Html.BeginForm())
{
#Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Opportunity</h4>
<hr />
#Html.Images(m => m.Graphics, "Graphics", "id")
#Html.ValidationMessageFor(model => model.Graphics, "", new { #class = "text-danger" })
</div>
</div>
<div class="form-horizontal">
<h4>Opportunity</h4>
<hr />
#Html.Images(m => m.FacultyPicture, "Graphics", "id")
#Html.ValidationMessageFor(model => model.FacultyPicture, "", new { #class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
And #Html.Images is a customhelper:
public static IHtmlString Images<TModel,TValue>(this HtmlHelper<TModel> helper,System.Linq.Expressions.Expression<Func<TModel, TValue>> expression, string name, string id){
TagBuilder tb = new TagBuilder("input");
tb.Attributes.Add("ex", expression.ToString());
tb.Attributes.Add("name", name);
tb.Attributes.Add("id", id);
tb.Attributes.Add("type", "file");
tb.Attributes.Add("accept", "Image/*");
return new MvcHtmlString(tb.ToString(TagRenderMode.SelfClosing));
}
}
It creates this output:
<input accept="Image/*" ex="m => m.Graphics" id="id" name="Graphics" type="file">
When I click the submit button:
The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
I have seend several methods to change the image file to Byte[] but I just don't know how to do it before the submit button or because it doesn't get into the "httppost method".
I have tried this solutions. but... I still get the error.
How to upload/display images using ASP.net MVC4 with Entity Framework
http://www.prideparrot.com/blog/archive/2012/8/uploading_and_returning_files
The question is how can I save this files into the databases in after clicking the submit button?
The properties in your model need to be HttpPostedFileBase (not byte[]) for binding to a file input in the view. Since your also wanting to store the filein the data base, you will need a separate view model and data model
// View model (Note ID property not required)
public class OpportunityVM
{
[Required(ErrorMessage = "Image is required")]
public HttpPostedFileBase Graphics { get; set; }
[DisplayName("Faculty Picture")]
public HttpPostedFileBase FacultyPicture { get; set; }
}
And in the POST method
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([OpportunityVM model)
{
if(!ModelState.IsValid)
{
return View(model);
}
// Initialize data model
Opportunity opportunity = new Opportunity();
using (var reader = new System.IO.BinaryReader(model.Graphics.InputStream))
{
opportunity.Graphics = reader.ReadBytes(model.Graphics.ContentLength);
}
if (model.FacultyPicture != null && modelFacultyPicture.ContentLength > 0)
{
// ditto for FacultyPicture
}
db.Opportunities.Add(opportunity);
db.SaveChanges();
return RedirectToAction("Index");
}
Note that you also need to include the enctype = "multipart/form-data" attribute in the form tag
#using (Html.BeginForm("Create", "Opportunities", FormMethod.Post, new { enctype = "multipart/form-data" }))
Side note: Your generating invalid html. Both file inputs in your model have id="id" (duplicate id attributes)
There is no need to pass the name and id to the helper (and in fact a minor typo passing the name means binding will fail). Instead use the ModelMetadata to generate the correct attributes. In addition, ex is not a valid attribute and its not clear what you are trying to achieve with tb.Attributes.Add("ex", expression.ToString()); but it should be removed.
public static IHtmlString Images<TModel,TValue>(this HtmlHelper<TModel> helper,System.Linq.Expressions.Expression<Func<TModel, TValue>> expression)
{
string name = ExpressionHelper.GetExpressionText(expression);
string id = HtmlHelper.GenerateIdFromName(name);
TagBuilder tb = new TagBuilder("input");
// tb.Attributes.Add("ex", expression.ToString());
tb.MergeAttribute("name", name);
tb.MergeAttribute("id", id);
tb.MergeAttribute("type", "file");
tb.MergeAttribute("accept", "Image/*");
return new MvcHtmlString(tb.ToString(TagRenderMode.SelfClosing));
}

Login in AngularJs using Controller Services, Web api and MVC model class

I want to create a Login form control in AngularJs. But the Username and Password should be fetched from the model class (Doctor.cs). Using the services controller and Web Api, if he is an authenticated doctor then he should be redirected to DoctorPanel.cshtml
login.cshtml
<div class="form-group">
<label for="inputEmail" class="col-sm-2 control-label">Email</label>
<div class="col-md-10">
<input type="email" id="email" class="form-control" ng-model="email" required />
</div>
</div>
<div class="form-group">
<label for="inputPwd" class="col-sm-2 control-label">Password</label>
<div class="col-md-10">
<input type="text" id="password" class="form-control" ng-model="password" required />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default" ng-click="login()" data-ng-disabled="!formLogin.$valid">login</button>
</div>
</div>
</form>
</div>
Model class Doctor.cs
public class Doctor
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
DoctorsAPIController.cs
public class DoctorsAPIController : ApiController
{
private DigitalHealthWebContext db = new DigitalHealthWebContext();
// GET: api/DoctorsAPI
public List<Doctor> GetDoctors()
{
return db.Doctors.ToList();
}
//public static List<Doctor> GetDoctors()
//{
// var query = from doctor in DigitalHealthWebContext.Doctors
// select doctor;
// return db.Doctors.ToList();
//}
// GET: api/DoctorsAPI/5
[ResponseType(typeof(Doctor))]
public async Task<IHttpActionResult> GetDoctor(int id)
{
Doctor doctor = await db.Doctors.FindAsync(id);
if (doctor == null)
{
return NotFound();
}
return Ok(doctor);
}
// PUT: api/DoctorsAPI/5
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutDoctor(int id, Doctor doctor)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != doctor.Id)
{
return BadRequest();
}
db.Entry(doctor).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!DoctorExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/DoctorsAPI
[ResponseType(typeof(Doctor))]
public async Task<IHttpActionResult> PostDoctor(Doctor doctor)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Doctors.Add(doctor);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = doctor.Id }, doctor);
}
// DELETE: api/DoctorsAPI/5
[ResponseType(typeof(Doctor))]
public async Task<IHttpActionResult> DeleteDoctor(int id)
{
Doctor doctor = await db.Doctors.FindAsync(id);
if (doctor == null)
{
return NotFound();
}
db.Doctors.Remove(doctor);
await db.SaveChangesAsync();
return Ok(doctor);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool DoctorExists(int id)
{
return db.Doctors.Count(e => e.Id == id) > 0;
}
}
I have 3 javascript files namely module.js, service.js, controller.js.
module.js
var app = angular.module("docModule", ["ngRoute"]);
//services.js
app.service('docService', function ($http) {
this.getDoctors = function () {
return $http.get("/api/DoctorsAPI");
}
});
Finally the controller comes
controller.js
app.controller('docController', function ($scope, docService) {
loadRecords();
function loadRecords() {
var promiseGet = docService.getDoctors(); //The MEthod Call from service
promiseGet.then(function (pl) { $scope.doctors = pl.data },
function (errorPl) {
$log.error('failure loading Doctor', errorPl);
});
}
});

Resources