我想按其他标准搜索,而不是通过id(WEB API)

时间:2014-08-14 09:46:26

标签: web-services rest asp.net-web-api

我是创建WEB API的初学者。

我从数据库自动生成模型,然后是每个模型的控制器,我的服务在默认设置下运行良好。

例如:

[ResponseType(typeof(student))]
    public IHttpActionResult Getstudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }

现在,当我使用时调用它: 本地主机... / API /学生/ 5
它返回正确的数据。

问题是:我希望通过其他内容进行搜索,而不是通过ID(主键)进行搜索,例如通过用户名和密码进行搜索。 我搜索了很多,很多人都在谈论路由,新方法,因为我是一个初学者,让我如此困惑。 如果有人可以帮助我,给我一些教程或任何东西,我将不胜感激。

这是我的控制器代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using System.Web.Http.Description;
    using studentsexams.Models;

    namespace studentsexams.Controllers
    {
        public class studentController : ApiController
        {
    private studentsEntities db = new studentsEntities();

    // GET api/student
    public IQueryable<student> Getstudents()
    {
        return db.students;
    }

    // GET api/student/5
    [ResponseType(typeof(student))]
    public IHttpActionResult Getstudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }

    public student GetStudentByName(string name)
    {
        return StudentRepository.GetStudents().FirstOrDefault(s => s.Id == 1);
    }



    // PUT api/student/5
    public IHttpActionResult Putstudent(int id, student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != student.ids)
        {
            return BadRequest();
        }

        db.Entry(student).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!studentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST api/student
    [ResponseType(typeof(student))]
    public IHttpActionResult Poststudent(student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.students.Add(student);

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateException)
        {
            if (studentExists(student.ids))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = student.ids }, student);
    }

    // DELETE api/student/5
    [ResponseType(typeof(student))]
    public IHttpActionResult Deletestudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        db.students.Remove(student);
        db.SaveChanges();

        return Ok(student);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool studentExists(int id)
    {
        return db.students.Count(e => e.ids == id) > 0;
    }
}

}

2 个答案:

答案 0 :(得分:0)

假设您要为GetStudentByName调用API操作,因此您需要在WebApiConfig中添加路由。

如下所示赞: -

config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}/{name}");

config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );

在控制器中添加操作赞: -

public Student GetStudentByName(string name)
    {
        return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
         //in this line just replace StudentName to your student name 
           //property of model class.
    }

并致电部分: -

$.getJSON('/api/student/GetStudentByName/abc', function (data) {
        $.each(data, function (key, value) {

        });
    });

因此,在此示例中,您将能够使用abc名称调用GetStudentByName操作。

答案 1 :(得分:0)

在控制器中我们应该添加 - 由Pragnesh Khalas回答:

public Student GetStudentByName(string name)
{
return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
}
此行中的

只是将StudentName替换为模型类的学生姓名属性。

它有效,它会返回正确的数据!